Spring AOP方法內(nèi)部調(diào)用不生效的解決方案
問題描述
最近有個(gè)需求,統(tǒng)計(jì)某個(gè)方法的調(diào)用次數(shù),開始使用 Spring AOP 實(shí)現(xiàn),后來發(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)用

解決方案
回到最開始的需求,如何通過切面的方式獲取某一個(gè)方法的調(diào)用次數(shù)? 包括方法自調(diào)用
使用 AopContext.currentProxy()
切面開啟注解
@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通過MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ)
這篇文章主要介紹了如何在Java中MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-03-03
Spring Security自定義認(rèn)證器的實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring Security自定義認(rèn)證器的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Spring?Boot整合郵箱發(fā)送郵件實(shí)例
大家好,本篇文章主要講的是Spring?Boot整合郵箱發(fā)送郵件實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
如何解決SpringBoot集成百度UEditor圖片上傳后直接訪問404
在本篇文章里小編給大家整理的是一篇關(guān)于如何解決SpringBoot集成百度UEditor圖片上傳后直接訪問404相關(guān)文章,需要的朋友們學(xué)習(xí)下。2019-11-11
Java面試之限流的實(shí)現(xiàn)方式小結(jié)
限流是指在各種應(yīng)用場(chǎng)景中,通過技術(shù)和策略手段對(duì)數(shù)據(jù)流量、請(qǐng)求頻率或資源消耗進(jìn)行有計(jì)劃的限制,本文為大家整理了常見的限流的實(shí)現(xiàn)方式,有需要的可以參考下2024-02-02
SpringBoot整合Redisson實(shí)現(xiàn)分布式鎖
本文主要介紹了SpringBoot整合Redisson實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

