解決spring項目找不到Aspect依賴註解的問題

spring項目找不到Aspect依賴註解

昨天寫一個項目的時候在使用Aspect時一直找不到依賴,alt+enter自動添加Maven依賴還是解決不瞭問題。

在這裡記錄下,希望能對大傢有幫助。

在pom.xml中添加一下依賴:

 <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <scope>test</scope>
        </dependency>

添加如上依賴,等待安裝之後,@Aspect註解就能正常使用瞭。

【特殊情況】

SpringBoot @Aspect註解不起作用的問題

搭建項目使用SpringBoot的AOP時候,發現一個問題。

我AOP類已經搞好瞭之後,項目運行起來,調用前後不會在控制臺打印。

我的AOP類是這樣的:

@Component
@Aspect
public class LogAspect {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
//  @Pointcut("execution(* com.wz.blog.*.*(..))")指定攔截com.wz.blog包下所有類的所有方法
    @Pointcut("execution(* com.wz.blog.*.*(..))")
    public void log() {}
    @Before(value = "log()")
    public void doBefore(){
        System.out.println("方法執行前。");
        logger.info("—————————————————doBefore—————————————————");
    }
    //在每個日志橫切面之後執行
    @After(value = "log()")
    public void doAfter(){
        System.out.println("方法執行後。");
        logger.info("—————————————————doAfter—————————————————");
    }
    @AfterReturning(returning = "result",pointcut = "log()")
    public void doAfterReturn(Object result){
        logger.info("Result : {}" + result);
    }
}

我的項目樹結構是這樣的

在這裡插入圖片描述

但是運行起來也沒報錯。

我是出現瞭這樣的情況:

在這裡插入圖片描述

如上圖,在index前後應該有INFO輸出和控制臺打印的,然而我並沒有。

針對以上問題網上有多種解決方案: (而我的解決方案仍不在其中。)

1、檢查pom.xml類中是否依賴。

2、檢查啟動類中是否有這兩個註解

@ComponentScan("com.wz.blog.*")
@EnableAspectJAutoProxy(proxyTargetClass = true)

3、檢查AOP類中除瞭@Aspect註解還應該有@Component註解。(這裡@Component用於開啟組件掃描,使得SpringBoot可以找到它。即交由SpringBoot管理。)

4、檢查AOP版本是否過老。

5、檢查AOP類是否和啟動類在同一等級。如果不在,應該使用2的方法進行指定。(這個方法和2有點重復)

好吧以上就是我搜羅的各種大牛提供的解決方法,無疑這些都是讓人欲罷不能的幹貨。然而並沒有解決我的問題。

在多個小時的反復測試之後,發現一個突破口:當我把AOP類中 @Pointcut(“execution(* com.wz.blog.*.*(..))”)的亂寫成 @Pointcut(“execution(* com.xxx.xxx.*.*(..))”)時候,報錯瞭,報錯信息如下:

warning no match for this type name:com.xxx.xxx [Xlint:invalidAbsoluteTypeName]

它說名稱不匹配?也就是說我的AOP類在項目運行時是被調用加載瞭的,這讓我放心瞭,我一開始以為此類未參與項目運行。

那麼我接著思考,有沒有可能是AOP語法出錯?導致我一開始指定的包壓根沒找到,或者說來沒來得及找到?於是我在網上搜索瞭報錯warning no match for this type name:com.xxx.xxx [Xlint:invalidAbsoluteTypeName]的原因。

發現,有的人在寫成execution(* com.wz.blog.*.*(..))是沒有任何錯誤的,說明很可能不是AOP語法的問題。

最終我發現,在IDEA不同的版本上運行,結果各不相同。

此前我使用IDEA正式版2020.1.1, 項目運行時AOP類就是不生效,而當我使用社區版運行時——

在這裡插入圖片描述

好吧,運行成功瞭。

但是我們不能一直使用社區版。

然後,就讓我找到瞭IDEA正式版的解決方案。

代碼如下:

@Component
@Aspect
public class LogAspect {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Pointcut("execution(* com.wz.blog.*..*(..))")
    public void log() {}
    //在每個日志橫切面之前執行
    @Before(value = "log()")
    public void doBefore(){
        System.out.println("方法執行前。");
        logger.info("—————————————————doBefore—————————————————");
    }
    //在每個日志橫切面之後執行
    @After(value = "log()")
    public void doAfter(){
        System.out.println("方法執行後。");
        logger.info("—————————————————doAfter—————————————————");
    }
//    returning = "result"實現通過參數result捕獲以上攔截方法的返回內容,pointcut = "log()"是取得切面
    @AfterReturning(returning = "result",pointcut = "log()")
    public void doAfterReturn(Object result){
        logger.info("Result : {}" + result);
    }
}

沒錯,和一開始需要改動的地方,隻有一個微小的地方不一樣。(不是註釋)把

@Pointcut("execution(* com.wz.blog.*.*(..))")

改成

@Pointcut("execution(* com.wz.blog.*..*(..))")

一個“.”的差別。

好吧,困擾大半天的謎團就此解開。

最後的最後,極度懷疑這個問題是IDEA2020.1.1的版本坑導致。

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

推薦閱讀: