Springboot如何使用Aspectj實現AOP面向切面編程

要在 Springboot中聲明 AspectJ 切面

需在 IOC 容器中將切面聲明為 Bean 實例 即加入@Component 註解;當在 Spring IOC 容器中初始化 AspectJ 切面之後, Spring IOC 容器就會為那些與 AspectJ 切面相匹配的 Bean 創建代理.

在 AspectJ 註解中, 切面隻是一個帶有 @Aspect 註解的 Java 類.

引入jar包       

網上都是說springboot使用Aspectj做面向切面編程的時候,隻需要引入下面jar包依賴即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

但是我去編寫的時候,單單引入 spring-boot-starter-aop 的jar依賴的時候,像@Component、@Aspect等這些註解都不能使用,後來發現缺少aspectjweaver 這麼個jar包,最後引入瞭下面的jar才解決問題 

    <dependency>
    <groupId>aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.5.3</version>
    </dependency> 

網上也有說要在application.properties中添加

spring.aop.auto=true這個配置,才能開啟Aspectj註解的掃面,但是我去查詢瞭springboot全局配置文件,裡面默認配置為true(spring.aop.auto=true # Add @EnableAspectJAutoProxy),所以我沒有去做添加,功能沒有問題,切面能正常實現。

最後補充一點小知識

 AspectJ 支持 5 種類型的通知註解

1)@Before:  前置通知:在方法執行之前執行的通知

2)@After: 後置通知, 在方法執行之後執行 , 即方法返回結果或者拋出異常的時候, 下面的後置通知記錄瞭方法的終止.

3)@AfterRunning: 返回通知, 在方法返回結果之後執行

ps:無論方法是正常返回還是拋出異常, 後置通知都會執行. 如果隻想在方法返回的時候記錄日志, 應使用返回通知代替後置通知.

4)@AfterThrowing: 異常通知, 在方法拋出異常之後

5) @Around: 環繞通知, 圍繞著方法執行(即方法前後都有執行)

環繞通知是所有通知類型中功能最為強大的, 能夠全面地控制連接點. 甚至可以控制是否執行連接點.

下面是我寫的一些通知的實例

大傢可以參考一下

        /*
        標識這個方法是個前置通知,  切點表達式表示執行任意類的任意方法.
        第一個 * 代表匹配任意修飾符及任意返回值, 
        第二個 * 代表任意類的對象,
        第三個 * 代表任意方法,
        參數列表中的 ..  匹配任意數量的參數
     */
 
    //@Before:  前置通知
    @Before("execution (* com.lc.project..controller..*.*(..))")
    public void beforeMethod(JoinPoint joinPoint){
        String methodName = joinPoint.getSignature().toString();
        Object result= Arrays.asList(joinPoint.getArgs());
            System.out.println("The method name:"+methodName+"--value:"+result);
    }
 
    //@After: 後置通知
    @After("execution (* *.*(..))")
    public void afterMethod(JoinPoint joinPoint){
                String methodName = joinPoint.getSignature().getName();
                System.out.println("The method name:"+methodName+ " ends");
    }
    //@AfterRunning: 返回通知
    @AfterReturning(value="execution (* *.*(..))",returning="result")
    public void afterReturningMethod(JoinPoint joinPoint,Object result){
                String methodName = joinPoint.getSignature().getName();
                System.out.println("The method name:"+methodName+ " ends and result="+result);
    }
    //@AfterThrowing: 異常通知
    @AfterThrowing(value="execution (* *.*(..))",throwing="e")
    public void afterReturningMethod(JoinPoint joinPoint,Exception e){
                String methodName = joinPoint.getSignature().getName();
                System.out.println("The method name:"+methodName+ " ends and result="+e);
    }  

  以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。               

推薦閱讀: