Отделение сквозных задач от бизнес-логики.

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>

Проверка нашего аспекта

Пришло время увидеть результат.

Спасибо за чтение! Если вам понравилось, пожалуйста, похлопайте 👏 в ладоши.