English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
After throwing은 Spring AOP의 권고사항 유형입니다. 메서드가 예외를 발생시키면 권고사항이 실행되도록 보장합니다. 우리는 @AfterThrowing 주석을 사용하여 throw 후 권고사항을 구현합니다。
문법:
@AfterThrowing(PointCut="execution(expression)", throwing="name")
그 중:
PointCut: 함수를 선택하십시오。
execution(expression):
throwing: 반환할 예외 이름.
애플리케이션에서 after를 구현하겠습니다.-throwing 권고사항.
이 장에서는 이전 예제를 사용합니다. 프로젝트를 다운로드하거나 이전 예제에서 일부 수정할 수 있습니다.
단계1: Spring Initializr를 열어 http://start.spring.io에 접속합니다.
第2단계: 제공합니다 그룹이름을 제공합니다. 우리는 그룹 이름을 제공합니다 com.w3codebox
단계3: 제공합니다 Artifact IdArtifact 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>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: 의 패키지에서 com.w3codebox.model中创建一个名称为 Account 의 클래스.
在"帐户"类中,执行以下操作:
定义了两个类型为String的变量 accountNumber 和 accountType 。 右键单击File -> Source->使用字段生成构造函数 生成Getters。
右键单击File-> 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 { //storing account detail in the HashMap private static Map<String, Account> map = null; static { map = new HashMap<>(); //adding account detail in the 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; //creating interface that throws exception if the customer id not found public interface AccountService { public abstract Account getAccountByCustomerId(String customerId) throws Exception; }
단계14: 의 이름이 com.w3codebox.aspect 패키지.
단계15: 의 패키지에서 com.w3codebox.aspect 에서 이름이 AccountAspect 의 클래스.
클래스에서 다음과 같은 방식으로 투척 후 조언 애니메이션을 구현했습니다 @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("Method throwing exception after:")+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 애플리케이션으로 실행합니다. 다음과 같은 출력이 표시됩니다: