1. 程式人生 > >spring aop無法攔截類內部的方法呼叫

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切面增強,把切面方法單獨封裝介面方法,在需要的地方呼叫