spring aop無法攔截類內部的方法呼叫
阿新 • • 發佈:2019-02-14
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;