English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SpringBoot AOP @AfterThrowing

After throwing은 Spring AOP의 권고사항 유형입니다. 메서드가 예외를 발생시키면 권고사항이 실행되도록 보장합니다. 우리는 @AfterThrowing 주석을 사용하여 throw 후 권고사항을 구현합니다。

문법:

@AfterThrowing(PointCut="execution(expression)", throwing="name")

그 중:

PointCut: 함수를 선택하십시오。

execution(expression):

throwing: 반환할 예외 이름.

애플리케이션에서 after를 구현하겠습니다.-throwing 권고사항.

Spring Boot @AfterThrowing 예제

이 장에서는 이전 예제를 사용합니다. 프로젝트를 다운로드하거나 이전 예제에서 일부 수정할 수 있습니다.

단계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()메서드.

주의: 우리가 throwing 속성에서 정의한 이름(ex)은 advice 메서드의 매개변수 이름과 일치해야 합니다. 그렇지 않으면, 권장사항은 실행되지 않습니다.

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 애플리케이션으로 실행합니다. 다음과 같은 출력이 표시됩니다: