Spring AOP功能和目標


1.AOP的作用

在OOP中,正是這種分散在各處且與對象核心功能無關的代碼(橫切代碼)的存在,使得模塊復用難度增加。AOP則將封裝好的對象剖開,找出其中對多個對象產生影響的公共行為,並將其封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),切面將那些與業務無關,卻被業務模塊共同調用的邏輯提取並封裝起來,減少了系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。

2.DI 和 IOC 概念

依賴注入或控制反轉的定義中,調用者不負責被調用者的實例創建工作,該工作由Spring框架中的容器來負責,它通過開發者的配置來判斷實例類型,創建后再注入調用者。由於Spring容器負責被調用者實例,實例創建后又負責將該實例注入調用者,因此稱為依賴注入。而被調用者的實例創建工作不再由調用者來創建而是由Spring來創建,控制權由應用代碼轉移到了外部容器,控制權發生了反轉,因此稱為控制反轉。

3.BeanFactory與ApplicationContext

ApplicationContext是BeanFactory的子接口,也被稱為應用上下文。BeanFactory提供了Spring的配置框架和基本功能,ApplicationContext則添加了更多企業級功能(如國際化的支持),他另一重要優勢在於當ApplicationContext容器初始化完成后,容器中所有的 singleton Bean 也都被實例化了,也就是說當你需要使用singleton Bean 是,在應用中無需等待就可以用,而其他BeanFactory接口的實現類,則會延遲到調用 getBean()方法時構造,ApplicationContext的初始化時間會稍長些,調用getBean()是由於Bean已經構造完畢,速度會更快。因此大部分系統都使用ApplicationContext,而只在資源較少的情況下,才考慮使用BeanFactory。

4.AOP的實現策略

(1)Java SE動態代理:
使用動態代理可以為一個或多個接口在運行期動態生成實現對象,生成的對象中實現接口的方法時可以添加增強代碼,從而實現AOP。缺點是只能針對接口進行代理,另外由於動態代理是通過反射實現的,有時可能要考慮反射調用的開銷。
(2)字節碼生成(CGLib 動態代理)
動態字節碼生成技術是指在運行時動態生成指定類的一個子類對象,並覆蓋其中特定方法,覆蓋方法時可以添加增強代碼,從而實現AOP。其常用工具是cglib。
(3)定制的類加載器
當需要對類的所有對象都添加增強,動態代理和字節碼生成本質上都需要動態構造代理對象,即最終被增強的對象是由AOP框架生成,不是開發者new出來的。解決的辦法就是實現自定義的類加載器,在一個類被加載時對其進行增強。JBoss就是采用這種方式實現AOP功能。
(4)代碼生成
利用工具在已有代碼基礎上生成新的代碼,其中可以添加任何橫切代碼來實現AOP。
(5)語言擴展
可以對構造方法和屬性的賦值操作進行增強,AspectJ是采用這種方式實現AOP的一個常見Java語言擴展。

核心概念

1、橫切關注點

對哪些方法進行攔截,攔截后怎么處理,這些關注點稱之為橫切關注點

2、切面(aspect)

類是對物體特征的抽象,切面就是對橫切關注點的抽象

3、連接點(joinpoint)

被攔截到的點,因為Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構造器

4、切入點(pointcut)

對連接點進行攔截的定義

5、通知(advice)

所謂通知指的就是指攔截到連接點之后要執行的代碼,通知分為前置、后置、異常、最終、環繞通知五類

6、目標對象

代理的目標對象

7、織入(weave)

將切面應用到目標對象並導致代理對象創建的過程

8、引入(introduction)

在不修改代碼的前提下,引入可以在運行期為類動態地添加一些方法或字段

Spring對AOP的支持

Spring中AOP代理由Spring的IOC容器負責生成、管理,其依賴關系也由IOC容器負責管理。因此,AOP代理可以直接使用容器中的其它bean實例作為目標,這種關系可由IOC容器的依賴注入提供。Spring創建代理的規則為:

1、默認使用Java動態代理來創建AOP代理,這樣就可以為任何接口實例創建代理了

2、當需要代理的類不是代理接口的時候,Spring會切換為使用CGLIB代理,也可強制使用CGLIB

AOP編程其實是很簡單的事情,縱觀AOP編程,程序員只需要參與三個部分:

1、定義普通業務組件

2、定義切入點,一個切入點可能橫切多個業務組件

3、定義增強處理,增強處理就是在AOP框架為普通業務組件織入的處理動作

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM