spring aop無法攔截類內部的方法調用


1.概念

攔截器的實現原理就是動態代理,實現AOP機制。Spring 的代理實現有兩種:一是基於 JDK Dynamic Proxy 技術而實現的;二是基於 CGLIB 技術而實現的。如果目標對象實現了接口,在默認情況下Spring會采用JDK的動態代理實現AOP

2.問題

在類C中,方法A調用方法B,

B方法被AOP攔截。(可能是方法B上在另外的@Aspect切面定義上了切點/也可能是加了@Transactional事務注解,底層原理也是AOP實現),最終A-》B ,B並不會觸發AOP。

3.解決方案

1.手動獲取代理對象

1.將當前的代理類暴露給線程使用,以下2種自己選一個實現即可。

注解實現方案:springboot:啟動類上加注解:@EnableAspectJAutoProxy(exposeProxy=true):

配置實現方案:<aop:aspectj-autoproxy expose-proxy="true" />

2.A中調用B:不要直接用this(因為this是目標對象,自然無法實現代理類的增強方法@before等),而是先去嘗試獲取代理類:UserServiceImpl service = AopContext.currentProxy() != null ? (UserService)AopContext.currentProxy() : this;

2.去除AOP切面增強,把切面方法單獨封裝接口方法,在需要的地方調用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM