天天看點

AOP

實作AOP的技術,主要分為兩大類:一是采用動态代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜态織入的方式,引入特定的文法建立“方面”,進而使得編譯器可以在編譯期間織入有關“方面”的代碼。

在運作期間通過代理方式向目标類植入增強的代碼 有兩種實作方式:基于接口的 JDK 動态代理和基于繼承的 CGLIB 動态代理。

a. 作⽤:AOP技術,利利⽤用⼀一種稱為“橫切”的技術,剖解開封裝的對象内部,并将那些影響了了多個類的公共⾏行行為封裝到⼀個可重⽤用子產品,并将其名為“Aspect”,即⽅方⾯面。所謂“⽅方⾯面”,簡單地說,就是将那些與業務⽆無關,卻為業務子產品所共同調⽤用的邏輯或責任封裝起來,便便于減少系統的重複代碼,降低子產品間的耦合度,并有利利于未來的可操作性和可維護性。

b. 實作:

i. ⼀一是采⽤用動态代理理技術,利利⽤用截取消息的⽅方式,對該消息進⾏行行裝飾,以取代原有對象⾏行行為的執⾏行行;

ii. ⼆二是采⽤用靜态織⼊入的⽅方式,引⼊入特定的文法建立“⽅方⾯面”,從⽽而使得編譯器器可以在編譯期間織⼊入有關“⽅方⾯面”的代

碼。

c.AOP用來封裝橫切關注點,具體可以在下面的場景中使用:

Authentication 權限

Caching 緩存

Context passing 内容傳遞

Error handling 錯誤處理

Lazy loading 懶加載

Debugging  調試

logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準

Performance optimization 性能優化

Persistence  持久化

Resource pooling 資源池

Synchronization 同步

Transactions 事務

d.AOP相關概念

切面(Aspect):一個關注點的子產品化,這個關注點實作可能另外橫切多個對象。事務管理是J2EE應用中一個很好的橫切關注點例子。方面用Spring的 Advisor或攔截器實作。

連接配接點(Joinpoint): 程式執行過程中明确的點,如方法的調用或特定的異常被抛出。

通知(Advice): 在特定的連接配接點,AOP架構執行的動作。各種類型的通知包括“around”、“before”和“throws”通知。通知類型将在下面讨論。許多AOP架構包括Spring都是以攔截器做通知模型,維護一個“圍繞”連接配接點的攔截器鍊。Spring中定義了四個advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice

切入點(Pointcut): 指定一個通知将被引發的一系列連接配接點的集合。AOP架構必須允許開發者指定切入點:例如,使用正規表達式。 Spring定義了Pointcut接口,用來組合MethodMatcher和ClassFilter,可以通過名字很清楚的了解, MethodMatcher是用來檢查目标類的方法是否可以被應用此通知,而ClassFilter是用來檢查Pointcut是否應該應用到目标類上

引入(Introduction): 添加方法或字段到被通知的類。 Spring允許引入新的接口到任何被通知的對象。例如,你可以使用一個引入使任何對象實作 IsModified接口,來簡化緩存。Spring中要使用Introduction, 可有通過DelegatingIntroductionInterceptor來實作通知,通過DefaultIntroductionAdvisor來配置Advice和代理類要實作的接口

目标對象(Target Object): 包含連接配接點的對象。也被稱作被通知或被代理對象。POJO

AOP代理(AOP Proxy): AOP架構建立的對象,包含通知。 在Spring中,AOP代理可以是JDK動态代理或者CGLIB代理。

織入(Weaving): 組裝方面來建立一個被通知對象。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在運作時完成。Spring和其他純Java AOP架構一樣,在運作時完成織入。

AOP

Spring JDK 動态代理需要實作 InvocationHandler 接口,重寫 invoke 方法,用戶端使用 Java.lang.reflect.Proxy 類産生動态代理類的對象。

代碼示例:

定義兩個接口:

JDK 動态代理的目标類必須要實作一個或多個接口,具有一定的局限性,如果不希望實作接口,可以使用 CGLIB代理。

下一篇: JPA事務復原