Отделение сквозных задач от бизнес-логики.
AOP (аспектно-ориентированное программирование) Spring обсуждалось ранее в статье Spring: A Head Start 🔥 - Introduction (Part 1).
Аспектно-ориентированное программирование (АОП) в основном помогает отделить сквозные проблемы от объектов, на которые они влияют.
Терминология АОП
В АОП есть некоторые термины и концепции, с которыми следует ознакомиться.
- Аспект: модуль (класс), в котором вы определяете сквозной код проблемы.
- Точка соединения: это точка в приложении, в которую можно подключить аспект.
💡 Это может быть вызываемый метод, генерируемое исключение или изменяемое поле.
- Совет: фактический код (то есть метод) аспекта, который будет выполняться в разных точках, и любые точки соединения. Имеет 5 различных типов.
- Pointcut: определяет, в каких точках соединения должны выполняться соответствующие рекомендации.
Типы советов
- до → Выполнить совет перед выполнением метода.
- после → Выполнить совет после выполнения метода, независимо от его результата.
- after-return → Выполнить рекомендацию после выполнения метода, только если метод завершился успешно.
- after-throwing → Выполнить рекомендацию только после того, как метод выдает исключение.
- около → Выполнить рекомендацию до и после вызова рекомендованного метода.
Реализация
Spring поддерживает синтаксис XML или синтаксис, основанный на AspectJ, который использует код Java для реализации настраиваемых аспектов.
Чтобы запачкать руки и понять, что мы можем делать с помощью AOP Framework, давайте реализуем аспект ведения журнала с использованием синтаксиса XML.
Класс пользователя
Это простой класс, поэтому мы можем запускать код рекомендаций аспекта в разных точках; у разных методов в классе User.
Аспект - Регистрация
Это простой модуль аспекта, который определяет методы, вызываемые в разных точках.
💡
retVal
- это возвращаемое значение из точек (методов) соединения, в которых применяется аспект. В нашем случае, если точка соединения находится вgetName()
методе класса User, тоretVal
будет присвоено имени пользователя.
Конфигурации
По сути, нам нужно определить аспект и сослаться на компонент аспекта. Итак, очевидно, что класс аспекта должен быть определен как bean-компонент.
Затем для каждого аспекта мы определяем Pointcuts, которые определяют точки соединения (то есть методы), в которых будут выполняться рекомендации.
В следующем примере определяется Pointcut с именем UserAllMethod, который соответствует всем методам в классе User.
💡 Если вы хотите применить к определенному методу вместо методов всего класса, используйте
execution(* User.getName(..))
.
Наконец, определите совет; фактический код метода, который будет выполняться в (до или после) точек соединения, которые мы определили.
⚠ Убедитесь, что вы добавили необходимые файлы JAR или определили зависимости в файле «pom.xml» в случае использования Maven.
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency>
Проверка нашего аспекта
Пришло время увидеть результат.
Спасибо за чтение! Если вам понравилось, пожалуйста, похлопайте 👏 в ладоши.