English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
After throwing - это тип предложения в Spring AOP. Если метод выбрасывает исключение, он гарантирует выполнение предложения. Мы используем @AfterThrowing Аннотация для реализации предложения after-throwing.
Грамматика:
@AfterThrowing(PointCut="execution(expression) ", throwing="name")
其中:
PointCut: Выберите функцию.
execution(expression):
throwing: Имя возвращаемого исключения.
Давайте реализуем предложение after-throwing в приложении.
В этом разделе мы будем использовать предыдущий пример. Вы можете загрузить проект или сделать некоторые изменения в предыдущем примере.
Шаг 1: Откройте Spring Initializr http://start.spring.io .
Шаг 2: предоставляет ГруппаНазвание. Мы предоставляем имя группы com.w3codebox.
Шаг 3: предоставляет Artifact Id.Предоставляет Artifact Id aop-after-throwing-advice-example.
Шаг 4: добавить Spring Web Зависимости.
Шаг 5: нажать Генерироватькнопка. Когда мы нажимаем кнопку "Создать", она упаковывает все стандарты в jar из файла и загрузите его на локальную систему.
Шаг 6: Извлечь
Шаг 7: ИмпортПапка, выполните следующие шаги:
Файл->Импорт->Существующий проект Maven->Следующий->Просмотр папки aop-throwing-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-throwing-advice-example</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>aop-after-throwing-advice-example</name> <description>Демонстрационный проект для 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: в пакете в пакете com.w3codebox.model создайте объект с именем Account класса.
В классе "帐户" выполняются следующие действия:
определили две переменные типа String accountNumber и accountType . Щелкните правой кнопкой мыши File -> Source -> Использовать поле для генерации конструктора Генерировать Getters.
Щелкните правой кнопкой мыши File -> Source -> Генерировать Getters и Setters -> Выберите Getters -> Генерировать Генерировать 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.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; //создание интерфейса, который выбрасывает исключение, если не найден идентификатор клиента public interface AccountService { public abstract Account getAccountByCustomerId(String customerId) throws Exception; }
Шаг 14: Создайте файл пакета com.w3codebox.aspect.
Шаг 15: в пакете com.w3codebox.aspect в классе AccountAspect класса.
В этом классе мы реализовали аннотацию after throwing advice, используя следующее @AfterThrowing. Мы также определили afterThrowingAdvice()Метод.
AccountAspect.java
package com.w3codebox.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class AccountAspect { //implementing after throwing advice @AfterThrowing(value="execution(* com.w3codebox.service.impl.AccountServiceImpl.*(..))", throwing="ex") public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) { System.out.println("After throwing exception in method:" + joinPoint.getSignature()); System.out.println("Exception is:" + ex.getMessage()); } }
Шаг 16: Открыть AopAfterThrowingAdviceExampleApplication.java Файл и добавьте аннотацию @EnableAspectJAutoProxy.
Аннотация поддерживает обработку с помощью AspectJ @Aspect Компонент для комментариев. Он используется вместе с аннотацией @Configuration.
мы используем аннотацию @EnableAspectJAutoProxy proxyTargetClass параметр. Параметр proxyTargetClass = true позволяет нам использовать CGLIB (библиотека генерации кода) прокси, а не по умолчанию интерфейсный JDK прокси-метод.
ConfigurableApplicationContext является интерфейсом, который предоставляет не только методы клиентов контекста приложения ApplicationContext, но и инструменты для конфигурации контекста приложения.
AopAfterThrowingAdviceExampleApplication.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 //@EnableAspectJAutoProxy аннотация поддерживает обработку компонентов, помеченных аннотацией @Aspect. Она аналогична тегу в конфигурации xml. @EnableAspectJAutoProxy(proxyTargetClass=true) public class AopAfterThrowingAdviceExampleApplication { public static void main(String[] args) { ConfigurableApplicationContext ac = SpringApplication.run(AopAfterThrowingAdviceExampleApplication.class, args); //Получение объекта account из контекста приложения AccountService accountService = ac.getBean("accountServiceImpl", AccountServiceImpl.class); Account account; try { //Генерация исключения account = accountService.getAccountByCustomerId(null); if (account != null) System.out.println(account.getAccountNumber() + "\t" + account.getAccountType()); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } }
После создания всех классов и пакетов структура проекта будет выглядеть следующим образом:
Шаг 17: Открыть AopAfterThrowingAdviceExampleApplication.java Запустите файл как Java-приложение. Оно отображает вывод, как показано ниже: