Spring AOP方法內(nèi)部調(diào)用不生效的解決方案
問(wèn)題描述
最近有個(gè)需求,統(tǒng)計(jì)某個(gè)方法的調(diào)用次數(shù),開(kāi)始使用 Spring AOP 實(shí)現(xiàn),后來(lái)發(fā)現(xiàn)當(dāng)方法被內(nèi)部調(diào)用時(shí),切面邏輯將不會(huì)生效,直接上樣例:
定義接口,包含方法 A,方法 B
public interface ISon {
void A();
void B();
}
定義接口實(shí)現(xiàn),方法 B 調(diào)用方法 A
@Service
public class Son implements ISon {
@Override
public void A() {
System.out.println("method A");
}
@Override
public void B() {
System.out.println("method B");
A();
}
}
切點(diǎn)定義,對(duì)方法 A 進(jìn)行增強(qiáng)
@Aspect
@Component
public class AspectDemo {
@Pointcut(value = "execution(* com.example.transactiondemo.aop.ISon.A(..))")
public void pointCut(){
}
@Before("pointCut()")
public void before(JoinPoint joinPoint){
System.out.println("before ");
}
@After("pointCut()")
public void after(){
System.out.println("after ");
}
}
測(cè)試
@Autowired
private ISon iSon;
@Test
public void test11(){
iSon.A();
System.out.println("-----------");
iSon.B();
}
打印輸出
before
method A
after
-----------
method B
method A
可以發(fā)現(xiàn),如果直接使用 實(shí)例調(diào)用 A,會(huì)進(jìn)行增強(qiáng);但是如果是方法 B 調(diào)用,A 的增強(qiáng)邏輯將失效。
失效原因
方法 A 被調(diào)用,是基于 AOP 生成的 代理對(duì)象 進(jìn)行的調(diào)用;方法 B 調(diào)用方法 A ,是 this 目標(biāo)對(duì)象 直接調(diào)用,并不是代理對(duì)象進(jìn)行調(diào)用

解決方案
回到最開(kāi)始的需求,如何通過(guò)切面的方式獲取某一個(gè)方法的調(diào)用次數(shù)? 包括方法自調(diào)用
使用 AopContext.currentProxy()
切面開(kāi)啟注解
@EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = true)
方法 B 不直接調(diào)用 A
@Override
public void B() {
System.out.println("method B");
((Son) AopContext.currentProxy()).A();
}
先獲取上下文的 Bean 再調(diào)用
@Autowired private ApplicationContext applicationContext; ((Son) applicationContext.getBean(Son.class)).A();
以上就是Spring AOP方法內(nèi)部調(diào)用不生效的解決方案的詳細(xì)內(nèi)容,更多關(guān)于Spring AOP方法調(diào)用不生效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java final 和instanceof 關(guān)鍵字的區(qū)別
這篇文章介紹了java final 和instanceof 關(guān)鍵字的區(qū)別,有需要的朋友可以參考一下2013-09-09
Spring Security 實(shí)現(xiàn)短信驗(yàn)證碼登錄功能
這篇文章主要介紹了Spring Security 實(shí)現(xiàn)短信驗(yàn)證碼登錄功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Java OpenCV4.0.0實(shí)現(xiàn)實(shí)時(shí)人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了Java OpenCV4.0.0實(shí)現(xiàn)實(shí)時(shí)人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問(wèn)題
這篇文章主要介紹了Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問(wèn)題,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
通過(guò)代碼示例了解submit與execute的區(qū)別
這篇文章主要介紹了通過(guò)代碼示例了解submit與execute的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

