一、AOP概述程序員
二、Spring AOP原理spring
三、Spring AOP架構解析編程
1、AOP概述架構
Java程序員在寫代碼的時候一般都是使用新建對象類來描述業務特性,而後經過對象的繼承、組合、擴展等手段來實現業務需求,這是典型的面相對象的編程方式即OOP,總的來講OOP是一種由上至下的豎向編程模式。框架
在實際的編程中,一般會遇到某些方法裏會使用到相同的邏輯,好比記方法執行日誌,這些代碼在OOP中無法與業務代碼徹底的解藕,使得方法代碼就有了混合邏輯,不符合編程的單一責任原則。若是能夠把這塊邏輯代碼解藕,通把兩種邏輯的代碼區分開,而後在運行期再合起來就完美了,就至關於在運行期橫向的添磚加瓦,也就是面向切面橫向的編程即AOP。性能
2、Spring AOP原理代理
實現AOP的主要技術就是動態代理 ,動態代理的原理這裏就不細說了,主要是來看看Spring AOP的實現原理 下載 。咱們知道一般使用的動態代理技術有JDK的和CGLIB的,其中JDK的動態代理只能代理接口級別,而CGLIB則還能夠代理類級別,在Spring中結合了這二者,使得其更靈活。日誌
在細說Spring AOP原理以前先來看看如下幾個重要的概念:htm
a、鏈接點(JoinPoint):程序執行的莫個特定位置,好比類初始化以前,類初始化以後,方法執行以前,方法執行以後,異常拋出以後等等。對象
b、切點(PointCut):指定程序執行的位置,每一個類對象都有多個JoinPoint,那麼到底要在哪一個JoinPoint上執行呢?這就須要用PointCut來指定,一般一個PointCut能夠對應多個JoinPoint。
c、加強(Advice):加強就是織入到目標類鏈接點上的一段程序代碼,很多地方叫它通知,筆者以爲叫加強更能表達其含義。Spring 中有BeforeAdvice,AfterAdvice等。其中AOP聯盟定義了標準接口Advice,Spring AOP也是基於它進行擴展的。
d、切面(Aspect):切面是切點和加強的組合,Spring AOP就是切面的實施框架,將切面中定義的加強邏輯實施到切面中指定的連結點中去。
e、代理(Proxy):一個類被織入加強的代碼後就會產生一個代理類,在運行期真正被執行的對象。
下面用圖來講一下Spring AOP的原理。 下載
Spring在初始化容器的時候會掃描相關的配置,包括XML、Annotation等,發現有標註了Aspect的Bean後會根據切面中切點定義找到目標類,而且爲其織入加強代碼而且經過代理生成器生成代理對象,而後供用戶使用。
3、Spring AOP架構解析 下載
下面用圖來闡述Spring AOP的主要組成部分以及其組件結構,先來看看Spring AOP的組件圖
Spring的AOP主要由四大組件構成,分別是切點組件、切面組件、加強組件、代理組件。
根據這四大組件,來看看具體的類圖。 下載
切點組件類圖:
PointCut接口只定義了兩個方法,一個是getClassFilter()用於獲取過濾器,判別切點可否用於目標類上,另外一個則是getMethodMatcher()用於獲取方法匹配器,spring提供靜態和動態的方法匹配器 下載 ,除此外還有別的方法匹配器,這裏就不列舉了,靜態方法匹配器僅根據方法簽名進行匹配,不關心運行時的參數,只匹配一次,而動態方法匹配器則由於每次方法執行傳入的參數可能不同,因此每次調用方法都須要判斷,對性能影響較大。
加強組件類圖:
AOP聯盟定義了AOP的標準,其中一個就是Advice加強接口,各大AOP框架都基於它來進行擴展,其中Spring就在它的基礎上擴展了AfterAdvice,BeforeAdvice,DynamicIntroductionAdvice,Inteceptor也是AOP聯盟定義的一個接口,用於環繞加強,即在方法執行的先後都織入加強邏輯 下載
代理組件類圖
在Spring裏,當容器初始化時掃描到切面類就會經過ProxyFactory的getProxy()來獲取代理對象,而後加入Bean存儲器供使用。從上圖中能夠清晰的看出Spring支持JDK和Cglib兩種動態代理方式。 下載
切面組件類圖
AOP總架構類圖
經過最後的總架構類圖就很清楚的知道Spring AOP框架的結構以及其個組件之間的組合關係