Учебники

Spring AOP — Краткое руководство

Spring AOP — Обзор

Одним из ключевых компонентов Spring Framework является среда аспектно-ориентированного программирования (AOP) . Аспектно-ориентированное программирование влечет за собой разделение логики программы на отдельные части, называемые так называемыми проблемами . Функции, охватывающие несколько точек приложения, называются сквозными задачами. Эти сквозные проблемы концептуально отделены от бизнес-логики приложения. Существуют различные общие хорошие примеры таких аспектов, как ведение журнала, аудит, декларативные транзакции, безопасность, кэширование и т. Д.

Ключевой единицей модульности в ООП является класс, тогда как в АОП единицей модульности является аспект. Внедрение зависимостей помогает вам отделить ваши прикладные объекты друг от друга, в то время как AOP помогает вам отделить сквозные задачи от объектов, на которые они влияют. AOP подобен триггерам в таких языках программирования, как Perl, .NET, Java и других.

Модуль Spring AOP позволяет перехватчикам перехватывать приложение. Например, когда метод выполняется, вы можете добавить дополнительные функции до или после выполнения метода.

Spring AOP — Настройка среды

В этой главе описан процесс настройки Spring AOP в системах на базе Windows и Linux. Spring AOP можно легко установить и интегрировать в текущую среду Java и MAVEN, выполнив несколько простых шагов без каких-либо сложных процедур настройки. Администрация пользователя требуется при установке.

Системные Требования

JDK Java SE 2 JDK 1.5 или выше
объем памяти 1 ГБ ОЗУ (рекомендуется)
Дисковое пространство Нет минимальных требований
Версия операционной системы Windows XP или выше, Linux

Давайте теперь посмотрим на шаги по установке Spring AOP.

Шаг 1. Проверьте вашу установку Java

Прежде всего, вам необходимо установить Java Software Development Kit (SDK) в вашей системе. Чтобы убедиться в этом, выполните любую из следующих двух команд в зависимости от платформы, на которой вы работаете.

Если установка Java была выполнена правильно, то на ней отобразится текущая версия и спецификация вашей установки Java. Пример вывода приведен в следующей таблице.

Платформа команда Пример вывода
Windows

Откройте командную консоль и введите —

\> Java-версия

Java версия «1.7.0_60»

Среда выполнения Java (TM) SE (сборка 1.7.0_60-b19)

64-разрядная серверная виртуальная машина Java Hotspot (TM) (сборка 24.60-b09, смешанный режим)

Linux

Откройте командный терминал и введите —

$ java-версия

Java-версия «1.7.0_25»

Открытая среда выполнения JDK (rhel-2.3.10.4.el6_4-x86_64)

Откройте виртуальную машину 64-разрядного сервера JDK (сборка 23.7-b01, смешанный режим)

Откройте командную консоль и введите —

\> Java-версия

Java версия «1.7.0_60»

Среда выполнения Java (TM) SE (сборка 1.7.0_60-b19)

64-разрядная серверная виртуальная машина Java Hotspot (TM) (сборка 24.60-b09, смешанный режим)

Откройте командный терминал и введите —

$ java-версия

Java-версия «1.7.0_25»

Открытая среда выполнения JDK (rhel-2.3.10.4.el6_4-x86_64)

Откройте виртуальную машину 64-разрядного сервера JDK (сборка 23.7-b01, смешанный режим)

Мы предполагаем, что читатели этого руководства установили Java SDK версии 1.7.0_60 в своей системе.

Если у вас нет Java SDK, загрузите его текущую версию с https://www.oracle.com/technetwork/java/javase/downloads/index.html и установите его.

Шаг 2. Установите среду Java

Установите переменную среды JAVA_HOME, чтобы она указывала на местоположение базовой директории, где установлена ​​Java на вашем компьютере. Например,

Sr.No. Платформа и описание
1

Windows

Установите JAVA_HOME в C: \ ProgramFiles \ java \ jdk1.7.0_60

2

Linux

Экспорт JAVA_HOME = / usr / local / java-current

Windows

Установите JAVA_HOME в C: \ ProgramFiles \ java \ jdk1.7.0_60

Linux

Экспорт JAVA_HOME = / usr / local / java-current

Добавьте полный путь расположения компилятора Java к системному пути.

Sr.No. Платформа и описание
1

Windows

Добавьте строку «C: \ Program Files \ Java \ jdk1.7.0_60 \ bin» в конец системной переменной Path.

2

Linux

Экспорт PATH = $ PATH: $ JAVA_HOME / bin /

Windows

Добавьте строку «C: \ Program Files \ Java \ jdk1.7.0_60 \ bin» в конец системной переменной Path.

Linux

Экспорт PATH = $ PATH: $ JAVA_HOME / bin /

Выполните команду java -version из командной строки, как описано выше.

Шаг 3: Загрузите архив Maven

Загрузите Maven 3.3.3 с https://maven.apache.org/download.cgi

Операционные системы Название архива
Windows apache-maven-3.3.3-bin.zip
Linux апач-Maven-3.3.3-bin.tar.gz
макинтош апач-Maven-3.3.3-bin.tar.gz

Шаг 4: Распакуйте архив Maven

Распакуйте архив в каталог, в который вы хотите установить Maven 3.3.3. Подкаталог apache-maven-3.3.3 будет создан из архива.

Операционные системы Местоположение (может отличаться в зависимости от вашей установки)
Windows C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3
Linux / USR / местные / Apache-Maven
макинтош / USR / местные / Apache-Maven

Шаг 5: Установите переменные среды Maven

Добавьте M2_HOME, M2, MAVEN_OPTS к переменным среды.

Операционные системы Выход
Windows

Установите переменные среды, используя системные свойства.

M2_HOME = C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3

M2 =% M2_HOME% \ bin

MAVEN_OPTS = -Xms256m -Xmx512m

Linux Откройте командный терминал и установите переменные среды.

экспорт M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3

экспорт M2 = $ M2_HOME / bin

экспорт MAVEN_OPTS = -Xms256m -Xmx512m

макинтош

Откройте командный терминал и установите переменные среды.

экспорт M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3

экспорт M2 = $ M2_HOME / bin

экспорт MAVEN_OPTS = -Xms256m -Xmx512m

Установите переменные среды, используя системные свойства.

M2_HOME = C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3

M2 =% M2_HOME% \ bin

MAVEN_OPTS = -Xms256m -Xmx512m

экспорт M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3

экспорт M2 = $ M2_HOME / bin

экспорт MAVEN_OPTS = -Xms256m -Xmx512m

Откройте командный терминал и установите переменные среды.

экспорт M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3

экспорт M2 = $ M2_HOME / bin

экспорт MAVEN_OPTS = -Xms256m -Xmx512m

Шаг 6: добавьте каталог Maven Bin в системный путь

Теперь добавьте переменную M2 к системному пути.

Операционные системы Выход
Windows Добавьте строку;% M2% в конец системной переменной Path.
Linux экспорт PATH = $ M2: $ PATH
макинтош экспорт PATH = $ M2: $ PATH

Шаг 7: Проверьте установку Maven

Теперь откройте консоль и выполните следующую команду mvn .

Операционные системы задача команда
Windows Открытая командная консоль c: \> mvn —version
Linux Открытый командный терминал $ mvn —version
макинтош Открытый терминал машина: <Джозеф $ mvn —version

Наконец, проверьте вывод приведенных выше команд, который должен выглядеть примерно так:

Операционные системы Выход
Windows

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30)

Дом Maven: C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3

Версия Java: 1.7.0_75, поставщик: корпорация Oracle

Домашняя страница Java: C: \ Program Files \ Java \ jdk1.7.0_75 \ jre

Локаль по умолчанию: en_US, кодировка платформы: Cp1252

Linux

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30)

Дом Maven: /usr/local/apache-maven/apache-maven-3.3.3

Версия Java: 1.7.0_75, поставщик: корпорация Oracle

Домашняя страница Java: /usr/local/java-current/jdk1.7.0_75/jre

макинтош

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30)

Дом Maven: /usr/local/apache-maven/apache-maven-3.3.3

Версия Java: 1.7.0_75, поставщик: корпорация Oracle

Домашняя страница Java: /Library/Java/Home/jdk1.7.0_75/jre

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30)

Дом Maven: C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3

Версия Java: 1.7.0_75, поставщик: корпорация Oracle

Домашняя страница Java: C: \ Program Files \ Java \ jdk1.7.0_75 \ jre

Локаль по умолчанию: en_US, кодировка платформы: Cp1252

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30)

Дом Maven: /usr/local/apache-maven/apache-maven-3.3.3

Версия Java: 1.7.0_75, поставщик: корпорация Oracle

Домашняя страница Java: /usr/local/java-current/jdk1.7.0_75/jre

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30)

Дом Maven: /usr/local/apache-maven/apache-maven-3.3.3

Версия Java: 1.7.0_75, поставщик: корпорация Oracle

Домашняя страница Java: /Library/Java/Home/jdk1.7.0_75/jre

Шаг 8 — Настройка Eclipse IDE

Все примеры в этом руководстве написаны с использованием Eclipse IDE. Поэтому я хотел бы предложить, чтобы на вашем компьютере была установлена ​​последняя версия Eclipse.

Чтобы установить Eclipse IDE, загрузите последние двоичные файлы Eclipse со страницы https://www.eclipse.org/downloads/ . После загрузки установки распакуйте бинарный дистрибутив в удобное место. Например, в C: \ eclipse в Windows или / usr / local / eclipse в Linux / Unix и, наконец, установите переменную PATH соответствующим образом.

Eclipse можно запустить, выполнив следующие команды на компьютере с Windows, или дважды щелкните файл eclipse.exe.

 %C:\eclipse\eclipse.exe

Eclipse можно запустить, выполнив следующие команды на компьютере Unix (Solaris, Linux и т. Д.):

$/usr/local/eclipse/eclipse

После успешного запуска, если все в порядке, он должен отобразить следующий результат —

Eclipse Home page

Как только вы закончите с этим последним шагом, вы готовы приступить к первому примеру AOP, который вы увидите в следующей главе.

Spring AOP — Основные понятия

Прежде чем мы начнем работать с AOP, давайте ознакомимся с концепциями и терминологиями AOP. Эти термины не являются специфическими для Spring, скорее они связаны с AOP.

Sr.No. Условия и описание
1

аспект

Модуль с набором API, обеспечивающих сквозные требования. Например, модуль регистрации будет называться аспектом AOP для регистрации. Приложение может иметь любое количество аспектов в зависимости от требования.

2

Точка соединения

Это представляет собой точку в вашем приложении, где вы можете подключить аспект AOP. Вы также можете сказать, что это фактическое место в приложении, где будет выполняться действие с использованием среды Spring AOP.

3

Совет

Это фактическое действие, которое должно быть выполнено либо до, либо после выполнения метода. Это фактический фрагмент кода, который вызывается во время выполнения программы средой Spring AOP.

4

Pointcut

Это набор из одной или нескольких точек соединения, где совет должен быть выполнен. Вы можете указать PointCuts, используя выражения или шаблоны, как мы увидим в наших примерах AOP.

5

Вступление

Введение позволяет добавлять новые методы или атрибуты в существующие классы.

6

Целевой объект

Объект рекомендуется одним или несколькими аспектами. Этот объект всегда будет прокси-объектом. Также называется рекомендованным объектом.

7

ткачество

Плетение — это процесс связывания аспектов с другими типами приложений или объектами для создания рекомендованного объекта. Это может быть сделано во время компиляции, загрузки или во время выполнения.

аспект

Модуль с набором API, обеспечивающих сквозные требования. Например, модуль регистрации будет называться аспектом AOP для регистрации. Приложение может иметь любое количество аспектов в зависимости от требования.

Точка соединения

Это представляет собой точку в вашем приложении, где вы можете подключить аспект AOP. Вы также можете сказать, что это фактическое место в приложении, где будет выполняться действие с использованием среды Spring AOP.

Совет

Это фактическое действие, которое должно быть выполнено либо до, либо после выполнения метода. Это фактический фрагмент кода, который вызывается во время выполнения программы средой Spring AOP.

Pointcut

Это набор из одной или нескольких точек соединения, где совет должен быть выполнен. Вы можете указать PointCuts, используя выражения или шаблоны, как мы увидим в наших примерах AOP.

Вступление

Введение позволяет добавлять новые методы или атрибуты в существующие классы.

Целевой объект

Объект рекомендуется одним или несколькими аспектами. Этот объект всегда будет прокси-объектом. Также называется рекомендованным объектом.

ткачество

Плетение — это процесс связывания аспектов с другими типами приложений или объектами для создания рекомендованного объекта. Это может быть сделано во время компиляции, загрузки или во время выполнения.

Spring AOP — Советы

Аспекты Spring могут работать с пятью советами, упомянутыми в следующей таблице.

Sr.No. Советы и описание
1

до

Запустите совет перед выполнением метода.

2

после

Запускайте совет после выполнения метода, независимо от его результата.

3

после возвращения

Запускайте рекомендацию после выполнения метода, только если метод завершается успешно.

4

после того, как бросание

Запускайте рекомендации после выполнения метода, только если метод завершается с помощью исключения.

5

вокруг

Выполните совет до и после вызова рекомендованного метода.

до

Запустите совет перед выполнением метода.

после

Запускайте совет после выполнения метода, независимо от его результата.

после возвращения

Запускайте рекомендацию после выполнения метода, только если метод завершается успешно.

после того, как бросание

Запускайте рекомендации после выполнения метода, только если метод завершается с помощью исключения.

вокруг

Выполните совет до и после вызова рекомендованного метода.

Spring AOP — Внедрения

Spring поддерживает подход стиля аннотации @AspectJ и подход на основе схемы для реализации пользовательских аспектов.

XML на основе схемы

Аспекты реализуются с использованием обычных классов наряду с конфигурацией на основе XML.

Чтобы использовать теги пространства имен AOP, описанные в этом разделе, вам необходимо импортировать схему весеннего AOP, описанную следующим образом:

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <!-- bean definition & AOP specific configuration -->

</beans>

Объявление аспекта

Аспект объявляется с использованием элемента <aop: aspect> , а на компонент поддержки ссылаются с помощью атрибута ref следующим образом.

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">
   ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

Здесь «aBean» будет настроен, и зависимость будет внедрена, как и любой другой bean-компонент Spring, как вы видели в предыдущих главах.

Объявление PointCut

PointCut помогает в определении точек соединения (т. Е. Методов ), представляющих интерес для выполнения с различными советами. При работе с конфигурацией на основе XML-схемы PointCut будет определяться следующим образом:

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">

   <aop:PointCut id = "businessService"
      expression = "execution(* com.xyz.myapp.service.*.*(..))"/>
      ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

В следующем примере определяется PointCut с именем «businessService», который будет соответствовать выполнению метода getName (), доступного в классе Student в пакете com.tutorialspoint.

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">

   <aop:PointCut id = "businessService"
      expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
   ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

Объявление Советов

Вы можете объявить любой из пяти советов внутри <aop: aspect>, используя элемент <aop: {ADVICE NAME}> следующим образом.

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">
      <aop:PointCut id = "businessService"
         expression = "execution(* com.xyz.myapp.service.*.*(..))"/>

      <!-- a before advice definition -->
      <aop:before PointCut-ref = "businessService" 
         method = "doRequiredTask"/>

      <!-- an after advice definition -->
      <aop:after PointCut-ref = "businessService" 
         method = "doRequiredTask"/>

      <!-- an after-returning advice definition -->
      <!--The doRequiredTask method must have parameter named retVal -->
      <aop:after-returning PointCut-ref = "businessService"
         returning = "retVal"
         method = "doRequiredTask"/>

      <!-- an after-throwing advice definition -->
      <!--The doRequiredTask method must have parameter named ex -->
      <aop:after-throwing PointCut-ref = "businessService"
        throwing = "ex"
         method = "doRequiredTask"/>

      <!-- an around advice definition -->
      <aop:around PointCut-ref = "businessService" 
         method = "doRequiredTask"/>
   ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

Вы можете использовать один и тот же doRequiredTask или разные методы для разных советов. Эти методы будут определены как часть аспектного модуля.

На основе @AspectJ

@AspectJ относится к стилю объявления аспектов как обычных классов Java, аннотированных аннотациями Java 5. @AspectJ относится к стилю объявления аспектов как обычных классов Java, аннотированных аннотациями Java 5. Поддержка @AspectJ включается включением следующего элемента в файл конфигурации на основе XML-схемы.

<aop:aspectj-autoproxy/>

Объявление аспекта

Классы аспектов похожи на любой другой нормальный компонент и могут иметь методы и поля, как и любой другой класс, за исключением того, что они будут помечены @Aspect следующим образом.

package org.xyz;

import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AspectModule {

}

Они будут настроены в XML как любой другой компонент следующим образом.

<bean id = "myAspect" class = "org.xyz.AspectModule">
   <!-- configure properties of aspect here as normal -->
</bean>

Объявление PointCut

PointCut помогает в определении точек соединения (т. Е. Методов ), представляющих интерес для выполнения с различными советами. При работе с конфигурацией на основе @AspectJ объявление PointCut состоит из двух частей:

  • Выражение PointCut, которое точно определяет, какие методы выполнения нас интересуют.

  • Подпись PointCut, содержащая имя и любое количество параметров. Фактическое тело метода не имеет значения и фактически должно быть пустым.

Выражение PointCut, которое точно определяет, какие методы выполнения нас интересуют.

Подпись PointCut, содержащая имя и любое количество параметров. Фактическое тело метода не имеет значения и фактически должно быть пустым.

В следующем примере определяется PointCut с именем «businessService», который будет соответствовать выполнению каждого метода, доступного в классах в пакете com.xyz.myapp.service.

import org.aspectj.lang.annotation.PointCut;

@PointCut("execution(* com.xyz.myapp.service.*.*(..))") // expression 
private void businessService() {}  // signature

В следующем примере определяется PointCut с именем ‘getname’, который будет соответствовать выполнению метода getName (), доступного в классе Student в пакете com.tutorialspoint.

import org.aspectj.lang.annotation.PointCut;

@PointCut("execution(* com.tutorialspoint.Student.getName(..))") 
private void getname() {}

Объявление Советов

Вы можете объявить любой из пяти советов, используя аннотации @ {ADVICE-NAME}, как указано ниже. Это предполагает, что вы уже определили метод подписи PointCut businessService ().

@Before("businessService()")
public void doBeforeTask(){
   ...
}

@After("businessService()")
public void doAfterTask(){
   ...
}

@AfterReturning(PointCut = "businessService()", returning = "retVal")
public void doAfterReturnningTask(Object retVal){
   // you can intercept retVal here.
   ...
}

@AfterThrowing(PointCut = "businessService()", throwing = "ex")
public void doAfterThrowingTask(Exception ex){
   // you can intercept thrown exception here.
   ...
}

@Around("businessService()")
public void doAroundTask(){
   ...
}

Вы можете определить PointCut inline для любого из советов. Ниже приведен пример определения встроенного PointCut для перед рекомендацией.

@Before("execution(* com.xyz.myapp.service.*.*(..))")
public doBeforeTask(){
   ...
}

Spring AOP — приложение на основе XML

В этой главе мы напишем реальные приложения AOP, используя Spring AOP Framework. Прежде чем приступить к написанию своего первого примера с использованием среды Spring-WS, необходимо убедиться, что вы правильно настроили среду Spring AOP, как описано в главе « Веб-службы Spring — Настройка среды» .

Теперь перейдем к написанию простого консольного приложения Spring AOP, которое продемонстрирует концепции AOP.

Создать проект

Шаг 1 — Откройте консоль команд, перейдите в каталог C: \ MVN и выполните следующую команду mvn .

C:\MVN>mvn archetype:generate -DgroupId = com.tutorialspoint -DartifactId = Student
	-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

Maven начнет обработку и создаст полную структуру проекта приложения Java.

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources
@ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources
@ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom --
-
[INFO] Generating project in Batch mode
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar (5 KB at 1.1 KB/s
ec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom (703 B at 1.2 KB/
sec)
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Old (1.x) Archetype:
 maven-archetype-quickstart:1.0
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.tutorialspoint
[INFO] Parameter: packageName, Value: com.tutorialspoint
[INFO] Parameter: package, Value: com.tutorialspoint
[INFO] Parameter: artifactId, Value: Student
[INFO] Parameter: basedir, Value: C:\MVN
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\MVN\Student
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:17 min
[INFO] Finished at: 2017-02-19T21:11:14+05:30
[INFO] Final Memory: 15M/114M
[INFO] ------------------------------------------------------------------------

Шаг 2 — Перейдите в каталог C: / MVN. Вы увидите созданный проект приложения Java с именем student (как указано в artifactId). Обновите файл POM.xml, включив в него зависимости Spring-AOP. Добавьте файлы MainApp.java, Student.java и Logging.java.

pom.xml

<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>Student</artifactId>
   <packaging>jar</packaging>
   <version>1.0-SNAPSHOT</version>
   <name>Student</name>
   <url>http://maven.apache.org</url>
   
   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
      </dependency>
      
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-aop</artifactId>
         <version>4.1.0.RELEASE</version>
      </dependency>
      
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>4.1.4.RELEASE</version>
      </dependency>
      
      <dependency>
         <groupId>org.aspectj</groupId>
         <artifactId>aspectjweaver</artifactId>
         <version>1.6.8</version>
      </dependency>
      
   </dependencies>
</project>
package com.tutorialspoint;

public class Logging {

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   public void beforeAdvice() {
      System.out.println("Going to setup student profile.");
   }

   /** 
    * This is the method which I would like to execute
    * after a selected method execution.
    */
   public void afterAdvice() {
      System.out.println("Student profile has been setup.");
   }

   /** 
    * This is the method which I would like to execute
    * when any method returns.
    */
   public void afterReturningAdvice(Object retVal){
      System.out.println("Returning:" + retVal.toString() );
   }

   /**
    * This is the method which I would like to execute
    * if there is an exception raised.
    */
   public void AfterThrowingAdvice(IllegalArgumentException ex) {
      System.out.println("There has been an exception: " + ex.toString());   
   }
   
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();
      
      student.printThrowException();
   }
}

Шаг 3 — Добавьте файл конфигурации Beans.xml в папку src> main> resources .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
            expression = "execution(* com.tutorialspoint.*.*(..))"/>
         <aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
         <aop:after PointCut-ref = "selectAll" method = "afterAdvice"/>
         <aop:after-returning PointCut-ref = "selectAll" 
            returning = "retVal"
            method = "afterReturningAdvice"/>
         <aop:after-throwing PointCut-ref = "selectAll" 
           throwing = "ex"
            method = "AfterThrowingAdvice"/>
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Шаг 4 — Откройте командную консоль, перейдите в каталог C: \ MVN и выполните следующую команду mvn .

C:\MVN>Student> mvn package

Maven начнет обработку и загрузку необходимых библиотек.

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Student 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven
-jar-plugin/2.4/maven-jar-plugin-2.4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-
jar-plugin/2.4/maven-jar-plugin-2.4.pom (6 KB at 2.2 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven
-jar-plugin/2.4/maven-jar-plugin-2.4.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-
jar-plugin/2.4/maven-jar-plugin-2.4.jar (34 KB at 31.6 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop
/4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/
4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom (3 KB at 3.7 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea
ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean
s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom (3 KB at 4.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor
e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core
/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom (3 KB at 4.0 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop
/4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor
e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea
ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/
4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar (351 KB at 43.9 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean
s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar (685 KB at 37.5 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core
/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar (982 KB at 47.1 KB/sec)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Student --
-
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\Student\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Student ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 1 source file to C:\MVN\Student\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ St
udent ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\Student\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ Student
 ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 1 source file to C:\MVN\Student\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Student ---
[INFO] Surefire report directory: C:\MVN\Student\target\surefire-reports
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure
fire-junit3/2.12.4/surefire-junit3-2.12.4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref
ire-junit3/2.12.4/surefire-junit3-2.12.4.pom (2 KB at 1.3 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure
fire-junit3/2.12.4/surefire-junit3-2.12.4.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref
ire-junit3/2.12.4/surefire-junit3-2.12.4.jar (26 KB at 27.7 KB/sec)

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.tutorialspoint.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ Student ---
Downloading: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-al
pha-2/classworlds-1.1-alpha-2.jar
Downloaded: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alp
ha-2/classworlds-1.1-alpha-2.jar (37 KB at 35.8 KB/sec)
[INFO] Building jar: C:\MVN\Student\target\Student-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.441 s
[INFO] Finished at: 2017-02-19T21:18:59+05:30
[INFO] Final Memory: 18M/109M
[INFO] ------------------------------------------------------------------------

Импортировать проект в Eclipse

Шаг 1 — Откройте Eclipse.

Шаг 2 — Выберите Файл → Импорт → опция.

Шаг 3 — Выберите опцию Maven Projects. Нажмите кнопку «Далее».

Шаг 4 — Выберите местоположение проекта, где проект Student был создан с использованием Maven.

Шаг 5 — Нажмите кнопку Готово.

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Name : Zara
Student profile has been setup.
Returning:Zara
Going to setup student profile.
Age : 11
Student profile has been setup.
Returning:11
Going to setup student profile.
Exception raised
Student profile has been setup.
There has been an exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
   at com.tutorialspoint.Student.printThrowException(Student.java:25)
   
   at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>)
   
   at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
   
   at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
   
   at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
   
   at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:43)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
   
   at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
   
   at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
   
   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
   
   at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
   
   at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$56a970f2.printThrowException(<generated>)
   
   at com.tutorialspoint.MainApp.main(MainApp.java:16)

Spring AOP — PointCut на основе XML

Точка соединения

JoinPoint представляет точку в вашем приложении, где вы можете подключить аспект AOP. Вы также можете сказать, что это фактическое место в приложении, где будет выполняться действие с использованием среды Spring AOP. Рассмотрим следующие примеры:

  • Все методы классов содержатся в пакете (ах).

  • Особые методы класса.

Все методы классов содержатся в пакете (ах).

Особые методы класса.

Pointcut

PointCut — это набор из одной или нескольких точек JoinPoints, в которых должен выполняться совет. Вы можете указать PointCuts, используя выражения или шаблоны, как мы увидим в наших примерах AOP. Весной PointCut помогает использовать определенные JoinPoints для применения рекомендаций. Рассмотрим следующие примеры:

  • выражение = «выполнение (* com.tutorialspoint. *. * (..))»

  • expression = «выполнение (* com.tutorialspoint.Student.getName (..))»

выражение = «выполнение (* com.tutorialspoint. *. * (..))»

expression = «выполнение (* com.tutorialspoint.Student.getName (..))»

Синтаксис

<aop:config>
   <aop:aspect id = "log" ref = "adviceClass">
      <aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>    
   </aop:aspect>
</aop:config>

Куда,

  • adviceClass — ссылка на класс, содержащий методы совета

  • PointCut-id — идентификатор PointCut

  • выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

adviceClass — ссылка на класс, содержащий методы совета

PointCut-id — идентификатор PointCut

выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

Чтобы понять вышеупомянутые концепции, связанные с JoinPoint и PointCut, давайте напишем пример, который будет реализовывать несколько из PointCuts. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

public class Logging {

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }   
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
         expression = "execution(* com.tutorialspoint.*.*(..))"/>
         <aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>         
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Как только вы закончите с созданием исходных файлов и файлов конфигурации бина, запустите приложение. Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11

Определенный выше <aop: pointcut> выбирает все методы, определенные в пакете com.tutorialspoint. Предположим, что вы хотите выполнить свой совет до или после определенного метода, вы можете определить свой PointCut, чтобы сузить выполнение, заменив звездочки (*) в определении PointCut фактическими именами классов и методов. Ниже приведен модифицированный файл конфигурации XML для демонстрации концепции.

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
            expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
         <aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Name : Zara
Age : 11 

Spring AOP — на основе XML до консультации

Before — это тип рекомендации, который гарантирует, что рекомендация выполняется до выполнения метода. Ниже приведен синтаксис перед советом.

Синтаксис

<aop:config>
   <aop:aspect id = "log" ref = "logging">
      <aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>    
      <aop:before PointCut-ref = "PointCut-id" method = "methodName"/>
   </aop:aspect>
</aop:config>

Куда,

  • PointCut-id — идентификатор PointCut.

  • methodName — Имя метода для функции, вызываемой перед вызываемой функцией.

PointCut-id — идентификатор PointCut.

methodName — Имя метода для функции, вызываемой перед вызываемой функцией.

Чтобы понять вышеупомянутые концепции, связанные с Before Advice, давайте напишем пример, который будет реализовывать Before Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

public class Logging {

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }   
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
            expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
         <aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Когда вы закончите создавать исходные файлы и файлы конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши MainApp.java в вашем приложении и используйте команду run as Java Application . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Name : Zara
Age : 11 

Spring AOP — на основе XML после консультации

After — это тип подсказки, который обеспечивает выполнение подсказки после выполнения метода. Ниже приводится синтаксис после совета.

Синтаксис

<aop:config>
   <aop:aspect id = "log" ref = "logging">
      <aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>    
      <aop:after PointCut-ref = "PointCut-id" method = "methodName"/>
   </aop:aspect>
</aop:config>

Куда,

  • PointCut-id — идентификатор PointCut.

  • methodName — Имя метода функции, которая будет вызвана после вызываемой функции.

PointCut-id — идентификатор PointCut.

methodName — Имя метода функции, которая будет вызвана после вызываемой функции.

Чтобы понять вышеупомянутые концепции, связанные с After Advice, давайте напишем пример, который будет реализовывать After Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

public class Logging {

   /** 
    * This is the method which I would like to execute
    * after a selected method execution.
    */
   public void afterAdvice(){
      System.out.println("Student profile setup complete.");
   }   
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
            expression = "execution(* com.tutorialspoint.Student.getAge(..))"/>
         <aop:after PointCut-ref = "selectAll" method = "afterAdvice"/>
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Когда вы закончите создавать исходные файлы и файлы конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши MainApp.java в вашем приложении и используйте команду run as Java Application . Если с вашим приложением все в порядке, будет напечатано следующее сообщение.

Name : Zara
Age : 11
Student profile setup complete.

Spring AOP — на основе XML после возвращения совета

After — это тип рекомендации, который гарантирует, что рекомендация запускается после выполнения метода, только если метод завершается успешно. Ниже приводится синтаксис после совета.

Синтаксис

<aop:config>
   <aop:aspect id = "log" ref = "logging">
      <aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>    
      <aop:after-returning PointCut-ref = "PointCut-id" 
         returning = "retVal" method = "methodName"/>
   </aop:aspect>
</aop:config>

Куда,

  • PointCut-id — идентификатор PointCut.

  • methodName — Имя метода функции, которая будет вызвана после успешного вызова вызываемой функции.

PointCut-id — идентификатор PointCut.

methodName — Имя метода функции, которая будет вызвана после успешного вызова вызываемой функции.

Чтобы понять вышеупомянутые концепции, связанные с уведомлением после возвращения, напишем пример, который будет реализовывать рекомендацию после возвращения. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring:

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

public class Logging {

   /** 
    * This is the method which I would like to execute
    * when any method returns.
    */
   public void afterReturningAdvice(Object retVal){
      System.out.println("Returning:" + retVal.toString() );
   }
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
         expression = "execution(* com.tutorialspoint.*.*(..))"/>
         <aop:after-returning PointCut-ref = "selectAll" 
            method = "afterReturningAdvice" returning = "retVal"/>         
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Name : Zara
Returning : Name
Age : 11
Exception raised

Spring AOP — Совет на основе XML после броска

After-throwing — это тип рекомендации, который гарантирует, что рекомендация выполняется после выполнения метода, только если метод завершается с помощью исключения. Ниже приводится синтаксис совета после броска.

Синтаксис

<aop:config>
   <aop:aspect id = "log" ref = "logging">
      <aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>    
      <aop:after-throwing PointCut-ref = "PointCut-id" throwing = "ex" 
         method = "methodName"/>
   </aop:aspect>
</aop:config>

Куда,

  • PointCut-id — идентификатор PointCut.

  • ex — Исключение, которое будет брошено.

  • methodName — Имя метода функции, которая будет вызвана, когда вызываемая функция генерирует исключение и завершается.

PointCut-id — идентификатор PointCut.

ex — Исключение, которое будет брошено.

methodName — Имя метода функции, которая будет вызвана, когда вызываемая функция генерирует исключение и завершается.

Чтобы понять вышеупомянутые концепции, связанные с Советом после броска, давайте напишем пример, который будет реализовывать Совет после броска. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring:

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

public class Logging {
   /**
    * This is the method which I would like to execute
    * if there is an exception raised.
    */
   public void afterThrowingAdvice(IllegalArgumentException ex) {
      System.out.println("There has been an exception: " + ex.toString());   
   } 
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      System.out.println("Age : " + age );
	  return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.printThrowException();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
         expression = "execution(* com.tutorialspoint.*.*(..))"/>
         <aop:after-throwing PointCut-ref = "selectAll" 
            throwing = "ex" method = "afterThrowingAdvice"/>         
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Exception raised
There has been an exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
   at com.tutorialspoint.Student.printThrowException(Student.java:25)
	
   at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>>)
	
   at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	
   at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
	
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	
   at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)
	
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	
   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	
   at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
	
   at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$8514cd8.printThrowException(<generated>)
	
   at com.tutorialspoint.MainApp.main(MainApp.java:15)

Spring AOP — Совет на основе XML

Вокруг тип подсказки, который гарантирует, что рекомендация выполняется до и после выполнения метода. Ниже приведен синтаксис вокруг совета.

Синтаксис

<aop:config>
   <aop:aspect id = "log" ref = "logging">
      <aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>    
      <aop:around PointCut-ref = "PointCut-id" method = "methodName"/>
   </aop:aspect>
</aop:config>

Куда,

  • PointCut-id — идентификатор PointCut.

  • methodName — Имя метода для функции, вызываемой перед вызываемой функцией.

PointCut-id — идентификатор PointCut.

methodName — Имя метода для функции, вызываемой перед вызываемой функцией.

Чтобы понять вышеупомянутые концепции, связанные с Around Advice, давайте напишем пример, который будет реализовывать Around Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring:

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class Logging {

   /** 
    * This is the method which I would like to execute
    * around a selected method execution.
    */
   public String aroundAdvice(ProceedingJoinPoint jp) throws Throwable{
      System.out.println("Around advice");
      Object[] args = jp.getArgs();
      if(args.length>0){
         System.out.print("Arguments passed: " );
         for (int i = 0; i < args.length; i++) {
            System.out.print("arg "+(i+1)+": "+args[i]);
         }
      }

      Object result = jp.proceed(args);
      System.out.println("Returning " + result);
      return result.toString();
   }   
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();    
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectName" 
            expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
         <aop:around PointCut-ref = "selectName" method = "aroundAdvice"/>
      </aop:aspect>
   </aop:config>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Around advice
Name : Zara
Returning Zara

Spring AOP — Приложение на основе аннотаций

Давайте напишем пример, который будет реализовывать рекомендации с использованием конфигурации на основе аннотаций. Для этого давайте создадим рабочую среду Eclipse и используем следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.PointCut;

@Aspect
public class Logging {

   /** Following is the definition for a PointCut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @PointCut("execution(* com.tutorialspoint.*.*(..))")
   private void selectAll(){}

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   @Before("selectAll()")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();   
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11

Spring AOP — PointCut на основе аннотации

JoinPoint

JoinPoint представляет точку в вашем приложении, где вы можете подключить аспект AOP. Вы также можете сказать, что это фактическое место в приложении, где будет выполняться действие с использованием среды Spring AOP. Рассмотрим следующие примеры:

  • Все методы классов содержатся в пакете (ах).

  • Особые методы класса.

Все методы классов содержатся в пакете (ах).

Особые методы класса.

Pointcut

PointCut — это набор из одного или нескольких JoinPoint, где совет должен быть выполнен. Вы можете указать PointCuts, используя выражения или шаблоны, как мы увидим в наших примерах AOP. Весной PointCut помогает использовать определенные JoinPoints для применения рекомендаций. Рассмотрим следующие примеры:

  • @PointCut («выполнение (* com.tutorialspoint. *. * (..))»)

  • @PointCut («выполнение (* com.tutorialspoint.Student.getName (..))»)

@PointCut («выполнение (* com.tutorialspoint. *. * (..))»)

@PointCut («выполнение (* com.tutorialspoint.Student.getName (..))»)

Синтаксис

@Aspect
public class Logging {

   @PointCut("execution(* com.tutorialspoint.*.*(..))")
   private void selectAll(){}

}

Куда,

  • @ Aspect — Отметить класс как класс, содержащий методы совета.

  • @PointCutпометить функцию как PointCut

  • выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

@ Aspect — Отметить класс как класс, содержащий методы совета.

@PointCutпометить функцию как PointCut

выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

Чтобы понять вышеупомянутые концепции, связанные с JoinPoint и PointCut, давайте напишем пример, который будет реализовывать несколько из PointCuts. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring:

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Logging {

   /** Following is the definition for a PointCut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @PointCut("execution(* com.tutorialspoint.*.*(..))")
   private void selectAll(){}

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   @Before("selectAll()")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11

Определенный выше @Pointcut использует выражение для выбора всех методов, определенных в пакете com.tutorialspoint. @ Перед рекомендацией в качестве параметра используется определенный выше PointCut. По сути, метод beforeAdvice () будет вызываться перед каждым методом, описанным выше PointCut.

Spring AOP — аннотация на основе рекомендаций

@Before — это тип рекомендации, который гарантирует, что рекомендация выполняется до выполнения метода. Ниже приводится синтаксис @Before advice.

Синтаксис

@PointCut("execution(* com.tutorialspoint.Student.getName(..))")
private void selectGetName(){}

@Before("selectGetName()")
public void beforeAdvice(){
   System.out.println("Going to setup student profile.");
} 

Куда,

  • @PointCutпометить функцию как PointCut

  • выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

  • @Beforeпометьте функцию как рекомендацию, которую нужно выполнить перед методами, охватываемыми PointCut.

@PointCutпометить функцию как PointCut

выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

@Beforeпометьте функцию как рекомендацию, которую нужно выполнить перед методами, охватываемыми PointCut.

Чтобы понять вышеупомянутые концепции, относящиеся к @Before Advice, давайте напишем пример, который будет реализовывать @Before Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring:

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Logging {

   /** Following is the definition for a PointCut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @PointCut("execution(* com.tutorialspoint.Student.getName(..))")
   private void selectGetName(){}

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   @Before("selectGetName()")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Name : Zara
Age : 11

Определенный выше @Pointcut использует выражение для выбора метода getAge (), определенного в классе (ах) в пакете com.tutorialspoint. @After advice использует вышеупомянутый PointCut в качестве параметра. Фактически метод afterAdvice () будет вызываться перед каждым методом, описанным выше в PointCut.

Spring AOP — аннотация на основе рекомендаций

@After — это тип подсказки, который обеспечивает выполнение подсказки после выполнения метода. Ниже приводится синтаксис @After advice.

Синтаксис

@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetName(){}

@After("selectGetAge()")
public void afterAdvice(){
   System.out.println("Student profile setup completed.");
} 

Куда,

  • @PointCutпометить функцию как PointCut

  • выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

  • @Afterпометить функцию как рекомендацию, которая должна быть выполнена перед методами, охватываемыми PointCut.

@PointCutпометить функцию как PointCut

выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

@Afterпометить функцию как рекомендацию, которая должна быть выполнена перед методами, охватываемыми PointCut.

Чтобы понять вышеупомянутые концепции, связанные с @After Advice, давайте напишем пример, который будет реализовывать @After Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.After;

@Aspect
public class Logging {

   /** Following is the definition for a PointCut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
   private void selectGetAge(){}

   /** 
    * This is the method which I would like to execute
    * after a selected method execution.
    */
   @After("selectGetAge()")
   public void afterAdvice(){
      System.out.println("Student profile setup completed.");
   }  
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Name : Zara
Age : 11
Student profile setup completed.

Определенный выше @Pointcut использует выражение для выбора метода getAge (), определенного в классе (ах) в пакете com.tutorialspoint. @After advice использует вышеупомянутый PointCut в качестве параметра. Фактически метод afterAdvice () будет вызываться перед каждым методом, описанным выше в PointCut.

Spring AOP — аннотация, основанная после возврата совета

@AfterReturning — это тип совета, который гарантирует, что совет будет запущен после успешного выполнения метода. Ниже приводится синтаксис @AfterReturning advice.

Синтаксис

@AfterReturning(PointCut = "execution(* com.tutorialspoint.Student.*(..))", 
   returning = "retVal")
public void afterReturningAdvice(JoinPoint jp, Object retVal){
   System.out.println("Method Signature: "  + jp.getSignature());  
   System.out.println("Returning:" + retVal.toString() );
}

Куда,

  • @AfterReturning — Пометьте функцию как рекомендацию, которая будет выполнена перед методом (ами), охватываемыми PointCut, если метод успешно завершится.

  • PointCut — предоставляет выражение для выбора функции.

  • выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

  • returning — имя переменной, которая будет возвращена.

@AfterReturning — Пометьте функцию как рекомендацию, которая будет выполнена перед методом (ами), охватываемыми PointCut, если метод успешно завершится.

PointCut — предоставляет выражение для выбора функции.

выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

returning — имя переменной, которая будет возвращена.

Чтобы понять вышеупомянутые концепции, относящиеся к @AfterReturning Advice, давайте напишем пример, который будет реализовывать @AfterReturning Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.JoinPoint;  
import org.aspectj.lang.annotation.AfterReturning; 

@Aspect
public class Logging {

   /** 
    * This is the method which I would like to execute
    * after a selected method execution.
    */
   @AfterReturning(PointCut = "execution(* com.tutorialspoint.Student.*(..))", 
      returning = "retVal")
   public void afterReturningAdvice(JoinPoint jp, Object retVal){
      System.out.println("Method Signature: "  + jp.getSignature());  
      System.out.println("Returning:" + retVal.toString() );
   }
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Age : 11
Method Signature: Integer com.tutorialspoint.Student.getAge()  
Returning 11

Spring AOP — аннотация, основанная на рекомендациях по выбрасыванию

@AfterThrowing — это тип подсказки, который обеспечивает выполнение подсказки, если метод выдает исключение. Ниже приводится синтаксис @AfterThrowing advice.

Синтаксис

@AfterThrowing(PointCut = "execution(* com.tutorialspoint.Student.*(..))", 
   throwing = "error")
public void afterThrowingAdvice(JoinPoint jp, Throwable error){
   System.out.println("Method Signature: "  + jp.getSignature());  
   System.out.println("Exception: "+error);  
}

Куда,

  • @AfterThrowing — Пометьте функцию как рекомендацию, которая будет выполняться перед методом (ами), охватываемыми PointCut, если метод выдает исключение.

  • PointCut — предоставляет выражение для выбора функции.

  • выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

  • throwing — Имя исключения, которое будет возвращено.

@AfterThrowing — Пометьте функцию как рекомендацию, которая будет выполняться перед методом (ами), охватываемыми PointCut, если метод выдает исключение.

PointCut — предоставляет выражение для выбора функции.

выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

throwing — Имя исключения, которое будет возвращено.

Чтобы понять вышеупомянутые концепции, относящиеся к @AfterThrowing Advice, давайте напишем пример, который будет реализовывать @AfterThrowing Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.JoinPoint;  
import org.aspectj.lang.annotation.AfterThrowing;  

@Aspect
public class Logging {

   /** 
    * This is the method which I would like to execute
    * after a selected method execution throws exception.
    */
   @AfterThrowing(PointCut = "execution(* com.tutorialspoint.Student.*(..))", 
      throwing = "error")
   public void afterThrowingAdvice(JoinPoint jp, Throwable error){
      System.out.println("Method Signature: "  + jp.getSignature());  
      System.out.println("Exception: "+error);  
   }
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.printThrowException();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Exception raised
Method Signature: void com.tutorialspoint.Student.printThrowException()
Exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
   
   at com.tutorialspoint.Student.printThrowException(Student.java:25)
   
   at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>)
   
   at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
   
   at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
   
   at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
   
   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
   
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
   
   at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
   
   at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$99b0a988.printThrowException(<generated>)
   
   at com.tutorialspoint.MainApp.main(MainApp.java:13)

Spring AOP — аннотации на основе рекомендаций

@Around — это тип рекомендации, который гарантирует, что рекомендация может выполняться до и после выполнения метода. Ниже приводится синтаксис @Around advice.

Синтаксис

@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetName(){}

@Around("selectGetAge()")
public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
   System.out.println("Around advice");
   Object[] args = jp.getArgs();
   if(args.length>0){
      System.out.print("Arguments passed: " );
      for (int i = 0; i < args.length; i++) {
         System.out.print("arg "+(i+1)+": "+args[i]);
      }
   }

   Object result = jp.proceed(args);
   System.out.println("Returning " + result);
   return result.toString();   
} 

Куда,

  • @PointCutпометить функцию как PointCut

  • выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

  • @Around — Отметить функцию как рекомендацию, которая будет выполнена перед методами, охватываемыми PointCut.

@PointCutпометить функцию как PointCut

выполнение (выражение) — выражение, охватывающее методы, к которым должен применяться совет.

@Around — Отметить функцию как рекомендацию, которая будет выполнена перед методами, охватываемыми PointCut.

Чтобы понять вышеупомянутые концепции, связанные с @Around Advice, давайте напишем пример, который будет реализовывать @Around Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring:

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint; 

@Aspect
public class Logging {

   /** Following is the definition for a PointCut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
   private void selectGetAge(){}

   /** 
    * This is the method which I would like to execute
    * around a selected method execution.
    */
   @Around("selectGetAge()")
   public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
      System.out.println("Around advice");
      Object[] args = proceedingJoinPoint.getArgs();
      if(args.length>0){
         System.out.print("Arguments passed: " );
         for (int i = 0; i < args.length; i++) {
            System.out.print("arg "+(i+1)+": "+args[i]);
         }
      }

      Object result = proceedingJoinPoint.proceed(args);
      System.out.println("Returning " + result);
   }  
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Around advice
Age : 11
Returning 11

Spring AOP — Прокси

Пока что мы объявили аспекты, используя <aop: config> или <aop: aspectj-autoproxy> . Мы можем создавать прокси программно, а также вызывать аспекты программно, используя объект прокси.

Синтаксис

//Create object to be proxied
Student student = new Student();

//Create the Proxy Factory
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);

//Add Aspect class to the factory
proxyFactory.addAspect(Logging.class);

//Get the proxy object
Student proxyStudent = proxyFactory.getProxy();

//Invoke the proxied method.
proxyStudent.getAge();

Куда,

  • AspectJProxyFactory — Фабричный класс для создания прокси-объекта.

  • Logging.class — класс аспекта, содержащий советы.

  • Студент — Бизнес класс, который нужно посоветовать.

AspectJProxyFactory — Фабричный класс для создания прокси-объекта.

Logging.class — класс аспекта, содержащий советы.

Студент — Бизнес класс, который нужно посоветовать.

Чтобы понять вышеупомянутые концепции, связанные с прокси, давайте напишем пример, который будет реализовывать прокси. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring:

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Logging {

   /** Following is the definition for a PointCut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
   private void selectGetAge(){}

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   @Before("selectGetAge()")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
  
   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }   
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      //Create the Proxy Factory
      AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);

      //Add Aspect class to the factory
      proxyFactory.addAspect(Logging.class);

      //Get the proxy object
      Student proxyStudent = proxyFactory.getProxy();

      //Invoke the proxied method.
      proxyStudent.getAge();
 
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.

Going to setup student profile.
Age : 11

Spring AOP — Пользовательская аннотация

Что касается выражений PointCut, это может быть случай, когда они применяются к некоторым другим bean-компонентам, для которых совет не предназначен. Например, рассмотрим следующее выражение.

execution(* com.tutorialspoint.*.getAge(..)) 

Новый Spring Bean добавляется с помощью метода getAge (), и совет начнет применяться к нему, хотя он может быть и не предназначен. Чтобы достичь этого, мы можем создать собственную аннотацию и аннотировать методы, к которым должен применяться совет.

@Before("@annotation(com.tutorialspoint.Loggable)")

Чтобы понять вышеупомянутые концепции, относящиеся к @Before Advice, давайте напишем пример, который будет реализовывать @Before Advice. Чтобы написать наш пример с несколькими советами, позвольте нам иметь работающую Eclipse IDE и использовать следующие шаги для создания приложения Spring.

шаг Описание
1 Обновление проекта Student создано в разделе Spring AOP — Приложение .
2 Обновите конфигурацию компонента и запустите приложение, как описано ниже.

Ниже приводится содержимое файла Logging.java . Это на самом деле образец аспектного модуля, который определяет методы, которые будут вызываться в различных точках.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Logging {

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   @Before("@annotation(com.tutorialspoint.Loggable)")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
}

Ниже приводится содержание файла Loggable.java

package com.tutorialspoint;

public @interface Loggable {

}

Ниже приводится содержание файла Student.java .

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }
   
   public void setName(String name) {
      this.name = name;
   }
   
   @Loggable
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

Ниже приводится содержание файла MainApp.java .

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

Ниже приведен файл конфигурации Beans.xml .

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Запустить проект

Как только вы закончите создание исходного файла и файлов конфигурации, запустите ваше приложение. Щелкните правой кнопкой мыши файл MainApp.java в своем приложении и используйте команду запуска от имени приложения Java . Если с вашим приложением все в порядке, оно напечатает следующее сообщение.