Введение в Spring AOP

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, поэтому его легко импортировать и беги как есть.