1. Вступление
В этом руководстве мы представим AOP (Аспектно-ориентированное программирование) в Spring и начнем понимать, как мы можем начать использовать этот мощный инструмент в практических ситуациях.
Также возможно использовать ссылку:/aspectj[аннотации AspectJ]при разработке с использованием Spring AOP, но в этой статье мы сосредоточимся на базовой конфигурации Spring AOP на основе XML.
2. Обзор
-
AOP - это парадигма программирования, целью которой является повышение модульности за счет разделения междисциплинарных задач. ** Это достигается путем добавления дополнительного поведения к существующему коду без изменения самого кода.
Вместо этого мы можем объявить этот новый код и эти новые поведения отдельно.
Https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop[AOP framework]Spring помогает нам реализовать эти сквозные задачи.
3. Зависимости Maven
Начнем с добавления зависимости библиотеки Spring AOP в pom.xml :
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE<version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
Последняя версия зависимости может быть проверена https://search.maven.org/classic/#search%7Cga%7C1%7C%20(g%3A%22org.springframework.boot%22%20AND%20a%3A% 22spring-загрузка стартер родитель% 22)% 20OR% 20% 20 (г% 3A% 22org.springframework.boot% 22% 20and% 20a% 3A% 22spring-загрузка стартер% 22)% 20OR% 20% 20 ( г% 3A% 22org.springframework.boot% 22% 20and% 20a% 3A% 22spring-загрузки-стартер-АОП% 22)[здесь].
4. Концепции и терминология АОП
Давайте кратко рассмотрим концепции и терминологию, характерные для АОП:
ссылка:/uploads/Program__Execution.jpg%201000w[]
4.1. Бизнес-объект
Бизнес-объект - это обычный класс с нормальной бизнес-логикой.
Давайте посмотрим на простой пример бизнес-объекта, где мы просто добавляем два числа:
public class SampleAdder {
public int add(int a, int b) {
return a + b;
}
}
Обратите внимание, что этот класс является обычным классом с бизнес-логикой и без каких-либо связанных с Spring аннотаций.
4.2. аспект
Одним из аспектов является модульность проблемы, которая охватывает несколько классов. Унифицированная регистрация может быть примером такой сквозной проблемы.
Давайте посмотрим, как мы определяем простой аспект:
public class AdderAfterReturnAspect {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public void afterReturn(Object returnValue) throws Throwable {
logger.info("value return was {}", returnValue);
}
}
В приведенном выше примере мы только что определили простой Java-класс, который имеет метод afterReturn , который принимает один аргумент типа Object , и он просто регистрирует это значение. Обратите внимание, что даже наш AdderAfterReturnAspect является стандартным классом, свободным от любых аннотаций Spring.
В следующих разделах мы увидим, как мы можем связать этот аспект с нашим бизнес-объектом.
4.3. Joinpoint
-
Joinpoint - это точка во время выполнения программы, например, при выполнении метода или обработке исключения. **
В Spring AOP JoinPoint всегда представляет выполнение метода.
4.4. Pointcut
Pointcut - это предикат, который помогает сопоставить Advice для применения Aspect в конкретном JoinPoint
Совет часто ассоциируется с выражением Pointcut и выполняется в любом Joinpoint , соответствующем Pointcut.
4.5. Совет
Совет - это действие, предпринимаемое аспектом в конкретном Joinpoint .
Различные типы рекомендаций включают «вокруг», «до» и «после» рекомендации.
Весной Advice моделируется как перехватчик, поддерживая цепочку перехватчиков вокруг Joinpoint .
4.6. Бизнес-объект и аспект проводки
Давайте посмотрим, как мы можем связать бизнес-объект с Аспектом с рекомендацией после возвращения.
Ниже приведен фрагмент конфигурации, который мы поместили бы в стандартную конфигурацию Spring в теге «<beans>» :
<bean id="sampleAdder" class="org.baeldung.logger.SampleAdder"/>
<bean id="doAfterReturningAspect"
class="org.baeldung.logger.AdderAfterReturnAspect"/>
<aop:config>
<aop:aspect id="aspects" ref="doAfterReturningAspect">
<aop:pointcut id="pointCutAfterReturning" expression=
"execution(** org.baeldung.logger.SampleAdder+.** (..))"/>
<aop:after-returning method="afterReturn"
returning="returnValue" pointcut-ref="pointCutAfterReturning"/>
</aop:aspect>
</aop:config>
Как видно, мы определили простой бин с именем simpleAdder , который представляет экземпляр бизнес-объекта. Кроме того, мы создаем экземпляр Aspect с именем AdderAfterReturnAspect .
XML, конечно, здесь не единственный вариант; как упоминалось ранее, аннотации AspectJ также полностью поддерживаются.
4.7. Конфигурация с первого взгляда
Тег aop: config используется для определения конфигурации, связанной с AOP. Внутри тега config мы определяем класс, который представляет аспект. Мы дали ему ссылку на «beAfterReturningAspect» __ созданный нами аспектный компонент.
Далее мы определяем Pointcut, используя тег pointcut . Pointcut, используемый в приведенном выше примере, - это execution ( org.baeldung.logger.SampleAdder. (..)) , что означает применение рекомендации для любого метода в классе SampleAdder , который принимает любое количество аргументов и возвращает любой тип значения.
Далее мы определяем, какой совет мы хотим применить. В приведенном выше примере мы собираемся применить рекомендацию после возврата, которая определена в нашем аспекте AdderAfterReturnAspect , выполнив метод с именем afterReturn , определенный с помощью метода атрибута.
Этот совет в Aspect принимает один параметр типа Object. Параметр дает нам возможность выполнить действие до и/или после вызова целевого метода. В этом случае мы просто регистрируем возвращаемое значение метода.
Spring AOP поддерживает несколько советов, используя конфигурацию на основе аннотаций - этот и другие примеры можно найти по ссылке:/spring-aop-advice-tutorial[здесь]и по ссылке:/spring-aop-pointcut-tutorial[здесь].
5. Заключение
В этом руководстве мы проиллюстрировали концепции, используемые в AOP, и пример использования модуля AOP в Spring. Если вам интересно узнать больше об АОП, вот несколько ресурсов:
-
ссылка:/aspectj[Введение в AspectJ]
-
ссылка:/spring-aop-annotation[Реализация пользовательского Spring AOP
Аннотация]** ссылка:/spring-aop-pointcut-tutorial[Введение в Pointcut
Выражения в весне]** ссылка:/spring-aop-vs-aspectj[Сравнение Spring AOP и AspectJ]
-
ссылка:/spring-aop-advice-tutorial[Введение в типы советов в
Весна]
Реализация этих примеров может быть найдена в the проект GitHub - это проект на основе Maven, поэтому его легко импортировать и беги как есть.