spring aop的實現可以分為三大部分
1. 註冊aop功能具體實現類
2. 普通bean例項化時aop的切入
3. aop切入具體流程
下面分析beanpostprocessor執行過程中,aop如何切入,上一節講到,普通bean初始化會呼叫如下方法
// 呼叫aop的真正實現方法入口
result = beanprocessor.postprocessafterinitialization(result, beanname);
aop此方法實際是繼承自abstractautoproxycreator, 跟蹤一下
postprocessafterinitialization的實現
建立**實際只有兩個步驟
1. 獲取增強方法或者增強器
2. 根據獲取到的增強器進行**
// class
@override
public object postprocessafterinitialization(object bean, string beanname) throws bean***ception
} return bean;
}protected object wrapifnecessary(object bean, string beanname, object cachekey)
首先跟蹤 獲取增強器 的邏輯
protected object getadvicesandadvisorsforbean(class> beanclass, string beanname, targetsource targetsource)
return advisors.toarray();
}protected listfindeligibleadvisors(class> beanclass, string beanname)
return eligibleadvisors;
}
繼續跟蹤 建立** 實現
protected object createproxy(
class> beanclass, string beanname, object specificinterceptors, targetsource targetsource)
**的真正實現呼叫過程(jdk動態**,或者cglib)不再贅述,比如動態**,最終會呼叫invoke,稍微看一下jdkdynamicaopproxy的invoke實現,內部通過chain儲存了增強器呼叫鏈,實現過程類似於職責鏈設計模式
// class jdkdynamicaopproxy
public object invoke(object proxy, method method, object args) throws throwable else
......
}public object proceed() throws throwable
// 獲取下乙個interceptor
object interceptororinterceptionadvice = this.interceptorsanddynamicmethodmatchers.get(++this.currentinterceptorindex);
......
// 這個方法,將this傳了進去,裡面的實現可以看出,實際在執行完當前interceptor的invoke方法後,接著執行this.proceed,即又呼叫回來了當前proceed方法,保證loop chain完成
return ((methodinterceptor)interceptororinterceptionadvice).invoke(this);
}// 比如 methodbeforeadviceinterceptor 的實現
@override
public object invoke(methodinvocation mi) throws throwable
Spring AOP 原始碼詳解
spring aop 是 spring 核心功能之一,日常的工作少不了和 aop 打交道 是時候有必要去了解 spring 對 aop 的封裝和其背後的原理,這樣子我們才能寫出更加高質量的 及產生 bug 的原因 什麼是 aop aop 的相關一些概念 spring aop 的使用方式 spring...
spring aop原始碼分析
面試中經常被問到什麼是aop,其實aop是一種技術實現,或者說是一種實現標準,實現aop的技術有多種,但是通常所說的aop,大家會不自覺的想到spring aop,因為spring aop被問了很多次。本文想從原始碼的執行流程上來簡單說說aop的實現原理。aop的底層技術其實就是大家熟知的 spri...
SpringAOP原始碼學習總結
1.使用 enableaspectjautoproxy啟用aop 2.建立abstractautoproxycreator 使用 enableaspectjautoproxy後,可以看到會 import aspectjautoproxyregistrar.class aspectjautoproxy...