spring AOP

guo duogdngengegghu說明


    通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP


    Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中


什麼是AOP


    AOP(Aspect Orient Programming),也就是面向切面編程


    面向對象編程(OOP)是從靜態角度考慮程序結構, 面向切面編程(AOP)是從動態角度考慮程序運行過程 


AOP的作用


    處理一些具有橫切性質的系統性服務,如事務管理、安全檢查、緩存、對象池管理等


AOP的實現原理


    AOP 實際上是由目標類的代理類實現的。AOP 代理其實是由AOP 框架動態生成的一個對象,該對象可作爲目標對象使用


    AOP 代理包含了目標對象的全部方法,但AOP 代理中的方法與目標對象的方法存在差異,AOP 方法在特定切入點添加了增強處理,並回調了目標對象的方法


AOP實現


1.靜態AOP
機制:靜態織入
原理:在編譯期,切面直接以字節碼的形式編譯到目標字節碼文件中
優點:對系統無性能影響
缺點:靈活性不夠
2.動態AOP
機制:動態代理
原理:在運行期,目標類加載後,爲接口動態生成代理類,將切面植入到代理類中
優點:相對於靜態AOP更加靈活
缺點:切入的關注點需要實現接口。對系統有一點性能影響
代表:JDK動態代理
接口 + InvocationHandler + 目標對象 = 代理
3.動態字節碼生成
機制:在運行期,目標類加載後,動態構建字節碼文件生成目標類的子類,將切面邏輯加入到子類中
原理:沒有接口也可以織入
優點:擴展類的實例方法爲final時,則無法進行織入
代表:Cglib動態代理(依賴ASM)
接口或類 + MethodInterceptor + 目標對象 = 代理
4.自定義加載器
機制:在運行期,目標加載前,將切面邏輯加到目標字節碼裏
原理:可以對絕大部分類進行織入
優點:代碼中如果使用了其他類加載器,則這些類將不會被織入
代表:Javassist
5.字節碼轉換
機制:在運行期,所有類加載器加載字節碼前,前進行攔截
原理:可以對所有類進行織入
代表:Javassit + Instrumentation


Spring對AOP的支持


    Spring 中AOP 代理由Spring 的IoC 容器負責生成、管理,其依賴關係也由IoC 容器負責管理。因此,AOP 代理可以直接使用容器中的其他Bean 實例作爲目標,這種關係可由IoC 容器的依賴注入提供


    Spring 默認使用Java 動態代理來創建AOP 代理, 這樣就可以爲任何接口實例創建代理了。當需要代理的類不是代理接口的時候, Spring 自動會切換爲使用CGLIB 代理,也可
強制使用CGLIB


    AOP 編程
    定義普通業務組件
    定義切入點,一個切入點可能橫切多個業務組件
    定義增強處理,增強處理就是在AOP 框架爲普通業務組件織入的處理動作


    所以進行AOP 編程的關鍵就是定義切入點和定義增強處理。一旦定義了合適的切入點和增強處理,AOP 框架將會自動生成AOP 代理,即:代理對象的方法 = 增強處理 + 被代理對象的方法


Spring中AOP的實現


1.基於Annotation 的“零配置”方式:使用@Aspect、@Pointcut 等Annotation 來標註切入點和增強處理
a.首先啓用Spring 對@AspectJ 切面配置的支持
b.定義切面Bean
當啓動了@AspectJ 支持後,只要在Spring 容器中配置一個帶@Aspect 註釋的Bean, Spring 將會自動識別該Bean 並作爲切面處理
c.定義@Before 增強處理
d.定義@AfterReturning 增強處理
e.定義@AfterThrowing 增強處理
f.定義@After 增強處理
After 增強處理與AfterReturning 增強處理有點相似,但也有區別
AfterReturning 增強處理處理只有在目標方法成功完成後纔會被織入
After增強處理不管目標方法如何結束(保存成功完成和遇到異常中止兩種情況),它都會被織入
g.@Around 增強處理
h.訪問目標方法的參數
i.定義切入點
所謂切入點,其實質就是爲一個切入點表達式起一個名稱,從而允許在多個增強處理中重用該名稱
一個切入點表達式
一個包含名字和任意參數的方法簽名


2.基於XML 配置文件的管理方式:使用Spring 配置文件來定義切入點和增強點


使用Spring ProxyFactoryBean創建代理


    使用 ProxyFactoryBean 來創建 AOP 代理的最重要的優點之一是 IoC 可以管理通知和切入點。 這是一個非常的強大的功能,能夠實現其他 AOP 框架很難實現的特定的方法。例如,一個通知本身可以引用應用對象(除了目標對象,它在任何 AOP 框架中都可以引用應用對象),這完全得益於依賴注入所提供的可插入性


a.ProxyFactoryBean的proxyInterfaces屬性,指明要代理的接口
b.ProxyFactoryBean的target屬性,指明要代理的目標類 ,這個目標類實現了上面proxyInterfaces屬性指定的接口
c.ProxyFactoryBean的interceptorNames屬性,指明要在代理的目標類中插入的Adivce 
d.ProxyFactoryBean還有一個proxyTargetClass屬性,如果這個屬性被設定爲“true”,說明 ProxyFactoryBean要代理的不是接口類,而是要使用CGLIB方式來進行代理,後面會詳細講解使用CGLIB方式來進行代理


IntroductionIntercepter


影響了目標物件的行爲定義,直接增 加了目標物件的職責


更多內容請關注微信公衆號:it_haha

wKioL1kyfuCiDBICAABq7LbW38I359.jpg-wh_50

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章