English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
After returningЭто предложение в Spring AOP, которое обычно вызывается после выполнения точки подключения (выполнения). Если вызывается исключение, вызов не производится. Мы можем использовать @AfterReturning Комментарии реализуются в приложении после возврата предложений. Комментарии помечают функцию как предложение, которое должно быть выполнено перед методом, охваченным PointCut.
После выполнения совета, когда метод выполняется с нормальным возвращаемым значением, выполняется этот совет. Название, определенное в свойстве return, должно соответствовать имени параметра в методе совета. При возвращении значения метода это значение передается в качестве соответствующего значения параметра в метод уведомления.
Давайте реализуем通知 после возвращения в приложении.
Шаг 1: Откройте Spring Initializr http://start.spring.io .
Шаг 2: предоставляет Группа Название. Мы предоставили имя группы com.w3codebox.
Шаг 3: предоставляет Artifact Id.Предоставляет Artifact Id aop-after-returning-advice-example.
Шаг 4: добавить Spring Web Зависимости.
Шаг 5: нажать Сгенерироватькнопка. При нажатии на кнопку "Создать" все нормы упаковываются в jar файл и загрузите его на локальную систему.
Шаг 6: Выгрузить
Шаг 7: Используйте следующие шаги для импортаПапка:
файл->Импорт->Существующий проект Maven->Далее->Перейти к папке Пример aop-returning-advice-example->Готово.
Шаг 8: Открыть pom.xml файл и добавьте следующее AOP Зависимости. Это использует Spring AOP и AspectJ Введение в面向方面的 программирование.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> </dependencies> pom.xml <?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd" <modelVersion>4.0.0</modelVersion> <groupId>com.w3codebox</groupId> <artifactId>aop-after-returning-advice-example</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>aop-after-returning-advice-example</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Шаг 9: 在 src/main/java папку Создать имя com.w3codebox.model в пакете.
Шаг 10: в пакете Создать объект с именем Account класса.
В классе "Account" выполните следующие действия:
определили два типа String переменных accountNumber и accountType . Щелкните правой кнопкой мыши файл -> Исходный код -> использовать поле для генерации конструктора Сгенерировать Getters.
Щелкните правой кнопкой мыши файл -> Source -> Generate Getters and Setters -> выберите Getters -> Generate Сгенерировать toString()
Щелкните правой кнопкой мыши файл -> Исходный код -> сгенерировать toString()...
Account.java
package com.w3codebox.model; public class Account { private String accountNumber; private String accountType; public Account(String accountNumber, String accountType) { super(); this.accountNumber = accountNumber; this.accountType = accountType; } public String getAccountType() { return accountType; } public String getAccountNumber() { return accountNumber; } @Override public String toString() { return "Account [accountNumber=" + accountNumber + ", accountType=" + accountType + "]"; } }
Шаг 11: Создайте еще один файл с именем пакет com.w3codebox.service.impl.
Шаг 12: В этом пакете создайте файл с именем Класс AccountServiceImple.
В этом классе мы определяем сервис счета.
AccountServiceImpl. Java
package com.w3codebox.service.impl; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.springframework.stereotype.Service; import com.w3codebox.model.Account; @Service public class AccountServiceImpl implements AccountService { //在 HashMap 中存储帐户细节 private static Map<String,Account> map = null; static { map = new HashMap<>(); //在map中添加帐户详细信息 map.put("M4546779", new Account("10441117000", "Saving Account")); map.put("K2434567", new Account("10863554577", "Current Account")); } @Override public Account getAccountByCustomerId(String customerId) throws Exception { if(customerId == null) { throw new Exception("Invalid! Customer Id"); } Account account= null; Set<Entry<String, Account>> entrySet = map.entrySet(); for (Entry<String, Account> entry : entrySet) { if(entry.getKey().equals(customerId)) { account= entry.getValue(); } } return account; } }
步骤13: 在 com.w3codebox.service.impl。包中创建名称为 AccountService 的接口。
AccountService.java
package com.w3codebox.service.impl; import com.w3codebox.model.Account; //正在创建一个接口,如果找不到客户id则引发异常 public interface AccountService { public abstract Account getAccountByCustomerId(String customerId) throws Exception; }
Шаг 14: Создайте объект с именем пакета com.w3codebox.aspect.
Шаг 15: в пакете com.w3codebox.aspect в создании объекта с именем AccountAspect класса.
В этом классе мы используем аннотацию @AfterReturning. Мы также определили afterReturningAdvice()метод.
Внимание: Мы в определенному в name(account) > returning параметр должен соответствовать метод adviceсоответствуют именам параметров.
AccountAspect.java
package com.w3codebox.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import com.w3codebox.model.Account; @Aspect @Component public class AccountAspect { //implementing after returning advice @AfterReturning(value="execution(* com.w3codebox.service.impl.AccountServiceImpl.*(..))", returning="account") public void afterReturningAdvice(JoinPoint joinPoint, Account account) { System.out.println("After Returning method:" + joinPoint.getSignature()); System.out.println(account); } }
Шаг 16: Открыть AopAfterReturningAdviceExampleApplication.java Файл и добавьте аннотацию @EnableAspectJAutoProxy.
Аннотация поддерживает обработку с помощью AspectJ @Aspect Компонент для комментариев. Он используется вместе с аннотацией @Configuration.
мы используем аннотацию @EnableAspectJAutoProxy proxyTargetClass параметр. Параметр proxyTargetClass = true позволяет нам использовать CGLIB (библиотека генерации кода) прокси, а не метод прокси по умолчанию, основанный на интерфейсе JDK.
ConfigurableApplicationContext является интерфейсом, который, помимо методов клиента контекста приложения ApplicationContext, предоставляет инструменты для конфигурации контекста приложения.
AopAfterReturningAdviceExampleApplication.java
package com.w3codebox; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.EnableAspectJAutoProxy; import com.w3codebox.model.Account; import com.w3codebox.service.impl.AccountService; import com.w3codebox.service.impl.AccountServiceImpl; @SpringBootApplication //@EnableSpectProxy аналогичная аннотация поддерживает обработку компонентов, помеченных аннотацией @Aspect. Она аналогична тегу в xml-настройках. @EnableAspectJAutoProxy(proxyTargetClass=true) public class AopAfterReturningAdviceExampleApplication { public static void main(String[] args) { ConfigurableApplicationContext ac = SpringApplication.run(AopAfterReturningAdviceExampleApplication.class, args); // Получить объект account из контекста приложения AccountService accountService = ac.getBean("accountServiceImpl", AccountServiceImpl.class); Account account; try { account = accountService.getAccountByCustomerId("K2434567"); if (account != null) System.out.println(account.getAccountNumber() + "\t" + account.getAccountType()); } catch (Exception e) { System.out.println(e.getMessage()); } } }
После создания всех классов и пакетов структура каталога проекта будет выглядеть следующим образом:
Шаг 17: Открыть AopAfterReturningAdviceExampleApplication.java Файл и запуск его в качестве Java приложения. Это показывает вывод, как показано ниже:
В следующем разделе, после предложения, мы поймем.