溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Springboot怎樣使用Aspectj實(shí)現(xiàn)AOP面向切面編程

發(fā)布時(shí)間:2022-01-04 00:37:36 來源:億速云 閱讀:313 作者:柒染 欄目:開發(fā)技術(shù)

Springboot怎樣使用Aspectj實(shí)現(xiàn)AOP面向切面編程,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

要在 Springboot中聲明 AspectJ 切面

需在 IOC 容器中將切面聲明為 Bean 實(shí)例 即加入@Component 注解;當(dāng)在 Spring IOC 容器中初始化 AspectJ 切面之后, Spring IOC 容器就會為那些與 AspectJ 切面相匹配的 Bean 創(chuàng)建代理.

在 AspectJ 注解中, 切面只是一個(gè)帶有 @Aspect 注解的 Java 類.

引入jar包       

網(wǎng)上都是說springboot使用Aspectj做面向切面編程的時(shí)候,只需要引入下面jar包依賴即可

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

但是我去編寫的時(shí)候,單單引入 spring-boot-starter-aop 的jar依賴的時(shí)候,像@Component、@Aspect等這些註解都不能使用,後來發(fā)現(xiàn)缺少aspectjweaver 這么個(gè)jar包,最后引入了下面的jar才解決問題 

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

網(wǎng)上也有說要在application.properties中添加

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

最后補(bǔ)充一點(diǎn)小知識

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

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

2)@After: 后置通知, 在方法執(zhí)行之后執(zhí)行 , 即方法返回結(jié)果或者拋出異常的時(shí)候, 下面的后置通知記錄了方法的終止.

3)@AfterRunning: 返回通知, 在方法返回結(jié)果之后執(zhí)行

ps:無論方法是正常返回還是拋出異常, 后置通知都會執(zhí)行. 如果只想在方法返回的時(shí)候記錄日志, 應(yīng)使用返回通知代替后置通知.

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

5) @Around: 環(huán)繞通知, 圍繞著方法執(zhí)行(即方法前后都有執(zhí)行)

環(huán)繞通知是所有通知類型中功能最為強(qiáng)大的, 能夠全面地控制連接點(diǎn). 甚至可以控制是否執(zhí)行連接點(diǎn).

下面是我寫的一些通知的實(shí)例

大家可以參考一下

        /*
        標(biāo)識這個(gè)方法是個(gè)前置通知,  切點(diǎn)表達(dá)式表示執(zhí)行任意類的任意方法.
        第一個(gè) * 代表匹配任意修飾符及任意返回值, 
        第二個(gè) * 代表任意類的對象,
        第三個(gè) * 代表任意方法,
        參數(shù)列表中的 ..  匹配任意數(shù)量的參數(shù)
     */
 
    //@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);
    }

看完上述內(nèi)容,你們掌握Springboot怎樣使用Aspectj實(shí)現(xiàn)AOP面向切面編程的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI