解決spring項(xiàng)目找不到Aspect依賴注解的問題
spring項(xiàng)目找不到Aspect依賴注解
昨天寫一個(gè)項(xiàng)目的時(shí)候在使用Aspect時(shí)一直找不到依賴,alt+enter自動(dòng)添加Maven依賴還是解決不了問題。
在這里記錄下,希望能對(duì)大家有幫助。
在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注解不起作用的問題
搭建項(xiàng)目使用SpringBoot的AOP時(shí)候,發(fā)現(xiàn)一個(gè)問題。
我AOP類已經(jīng)搞好了之后,項(xiàng)目運(yùn)行起來,調(diào)用前后不會(huì)在控制臺(tái)打印。
我的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("方法執(zhí)行前。"); logger.info("—————————————————doBefore—————————————————"); } //在每個(gè)日志橫切面之后執(zhí)行 @After(value = "log()") public void doAfter(){ System.out.println("方法執(zhí)行后。"); logger.info("—————————————————doAfter—————————————————"); } @AfterReturning(returning = "result",pointcut = "log()") public void doAfterReturn(Object result){ logger.info("Result : {}" + result); } }
我的項(xiàng)目樹結(jié)構(gòu)是這樣的
但是運(yùn)行起來也沒報(bào)錯(cuò)。
我是出現(xiàn)了這樣的情況:
如上圖,在index前后應(yīng)該有INFO輸出和控制臺(tái)打印的,然而我并沒有。
針對(duì)以上問題網(wǎng)上有多種解決方案: (而我的解決方案仍不在其中。)
1、檢查pom.xml類中是否依賴。
2、檢查啟動(dòng)類中是否有這兩個(gè)注解
@ComponentScan("com.wz.blog.*") @EnableAspectJAutoProxy(proxyTargetClass = true)
3、檢查AOP類中除了@Aspect注解還應(yīng)該有@Component注解。(這里@Component用于開啟組件掃描,使得SpringBoot可以找到它。即交由SpringBoot管理。)
4、檢查AOP版本是否過老。
5、檢查AOP類是否和啟動(dòng)類在同一等級(jí)。如果不在,應(yīng)該使用2的方法進(jìn)行指定。(這個(gè)方法和2有點(diǎn)重復(fù))
好吧以上就是我搜羅的各種大牛提供的解決方法,無疑這些都是讓人欲罷不能的干貨。然而并沒有解決我的問題。
在多個(gè)小時(shí)的反復(fù)測(cè)試之后,發(fā)現(xiàn)一個(gè)突破口:當(dāng)我把AOP類中 @Pointcut("execution(* com.wz.blog.*.*(..))")的亂寫成 @Pointcut("execution(* com.xxx.xxx.*.*(..))")時(shí)候,報(bào)錯(cuò)了,報(bào)錯(cuò)信息如下:
warning no match for this type name:com.xxx.xxx [Xlint:invalidAbsoluteTypeName]
它說名稱不匹配?也就是說我的AOP類在項(xiàng)目運(yùn)行時(shí)是被調(diào)用加載了的,這讓我放心了,我一開始以為此類未參與項(xiàng)目運(yùn)行。
那么我接著思考,有沒有可能是AOP語法出錯(cuò)?導(dǎo)致我一開始指定的包壓根沒找到,或者說來沒來得及找到?于是我在網(wǎng)上搜索了報(bào)錯(cuò)warning no match for this type name:com.xxx.xxx [Xlint:invalidAbsoluteTypeName]的原因。
發(fā)現(xiàn),有的人在寫成execution(* com.wz.blog.*.*(..))是沒有任何錯(cuò)誤的,說明很可能不是AOP語法的問題。
最終我發(fā)現(xiàn),在IDEA不同的版本上運(yùn)行,結(jié)果各不相同。
此前我使用IDEA正式版2020.1.1, 項(xiàng)目運(yùn)行時(shí)AOP類就是不生效,而當(dāng)我使用社區(qū)版運(yùn)行時(shí)——
好吧,運(yùn)行成功了。
但是我們不能一直使用社區(qū)版。
然后,就讓我找到了IDEA正式版的解決方案。
代碼如下:
@Component @Aspect public class LogAspect { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Pointcut("execution(* com.wz.blog.*..*(..))") public void log() {} //在每個(gè)日志橫切面之前執(zhí)行 @Before(value = "log()") public void doBefore(){ System.out.println("方法執(zhí)行前。"); logger.info("—————————————————doBefore—————————————————"); } //在每個(gè)日志橫切面之后執(zhí)行 @After(value = "log()") public void doAfter(){ System.out.println("方法執(zhí)行后。"); logger.info("—————————————————doAfter—————————————————"); } // returning = "result"實(shí)現(xiàn)通過參數(shù)result捕獲以上攔截方法的返回內(nèi)容,pointcut = "log()"是取得切面 @AfterReturning(returning = "result",pointcut = "log()") public void doAfterReturn(Object result){ logger.info("Result : {}" + result); } }
沒錯(cuò),和一開始需要改動(dòng)的地方,只有一個(gè)微小的地方不一樣。(不是注釋)把
@Pointcut("execution(* com.wz.blog.*.*(..))")
改成
@Pointcut("execution(* com.wz.blog.*..*(..))")
一個(gè)“.”的差別。
好吧,困擾大半天的謎團(tuán)就此解開。
最后的最后,極度懷疑這個(gè)問題是IDEA2020.1.1的版本坑導(dǎo)致。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Spring使用AspectJ的注解式實(shí)現(xiàn)AOP面向切面編程
- 在Spring 中使用@Aspect 控制自定義注解的操作
- Spring-基于Spring使用自定義注解及Aspect實(shí)現(xiàn)數(shù)據(jù)庫切換操作
- Spring AspectJ AOP框架注解原理解析
- 基于spring@aspect注解的aop實(shí)現(xiàn)過程代碼實(shí)例
- Spring Aop之AspectJ注解配置實(shí)現(xiàn)日志管理的方法
- 詳解SpringBoot AOP 攔截器(Aspect注解方式)
- spring使用aspect注解切面不起作用的排查過程及解決
相關(guān)文章
解決RestTemplate 請(qǐng)求接收自定義400+ 或500+錯(cuò)誤
這篇文章主要介紹了解決RestTemplate 請(qǐng)求接收自定義400+ 或500+錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java 刪除數(shù)組元素與刪除重復(fù)數(shù)組元素的代碼
在java中刪除數(shù)組元素與過濾重復(fù)數(shù)組元素我們都會(huì)需要去遍歷數(shù)組然后根據(jù)我們?cè)O(shè)置的值或方法進(jìn)行去除數(shù)組2013-10-10mybatis實(shí)現(xiàn)增刪改查_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文通過實(shí)例代碼給大家介紹了mybatis實(shí)現(xiàn)增刪改查功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09SpringBoot實(shí)現(xiàn)HTTP服務(wù)監(jiān)聽的代碼示例
前后端分離項(xiàng)目中,在調(diào)用接口調(diào)試時(shí)候,我們可以通過cpolar內(nèi)網(wǎng)穿透將本地服務(wù)端接口模擬公共網(wǎng)絡(luò)環(huán)境遠(yuǎn)程調(diào)用調(diào)試,本次教程我們以Java服務(wù)端接口為例,需要的朋友可以參考下2023-05-05java?MongoDB實(shí)現(xiàn)列表分頁查詢的示例代碼
本文主要介紹了java?MongoDB實(shí)現(xiàn)列表分頁查詢的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07使用自定義注解和@Aspect實(shí)現(xiàn)責(zé)任鏈模式的組件增強(qiáng)的詳細(xì)代碼
責(zé)任鏈模式是一種行為設(shè)計(jì)模式,其作用是將請(qǐng)求的發(fā)送者和接收者解耦,從而可以靈活地組織和處理請(qǐng)求,本文講給大家介紹如何使用自定義注解和@Aspect實(shí)現(xiàn)責(zé)任鏈模式的組件增強(qiáng),文中有詳細(xì)的代碼示例供大家參考,感興趣的同學(xué)可以借鑒一下2023-05-05