Spring
Java
tags: OOP | AOP |
---|---|
Object Oriented Programming | Aspect Oriented Programming |
高內聚 | Decorator, Proxy pattern |
簡介
- OOP不適合定義橫向關係,例如日誌功能,日誌代碼往往橫向地散佈在所有對象層次中,而與它對應的對象的核心功能毫無關係
- 散佈在各處的無關的代碼被稱為橫切(cross cutting)
- 導致了大量代碼的重複,而不利於各個模塊的重用
- 水平切割:影響多個class的行為封裝到一個可重用模組,減少系統的重複程式碼,降低模組間的耦合度
- 一個攔截器(interceptor)攔截一些處理過程,例如,當一個method被執行,Spring AOP能夠劫持正在運行的method,在method執行前或者後加入一些額外的功能
- 應用:日誌記錄、事務處理、異常處理、安全控制和效能統計方面
名詞解釋
-
Cross-cutting concerns:橫切
- 插入一些與物件核心功能無關的代碼至各個物件的處理流程
- 若直接撰寫在負責某business的物件之流程中,會使得維護程式的成本增高,例如若您今天要將物件中的記錄功能修改或是移除該服務,則必須修改所 有撰寫曾記錄服務的程式碼,然後重新編譯
-
Target Object
- 通常是runtime proxies
- 通常是runtime proxies
-
Aspect 切面
- 將散落於各個business物件之中的Cross-cutting concerns收集起來,設計各個獨立可重用的物件
- 事務處理和日誌處理可以理解為兩個切面
- Transaction Management
<tx:annotation-driven transaction-manager="transactionManager" />
- Weaving 織入
- Weave至應用程式之上,不需要服務的時候,也可以馬上從應用程式中脫離,應用程式中的可重用元件不用作任何的修改
- 將Aspect代碼插入到Proxy的過程
- 代理的invoke方法完成的工作
- 類型
- Compile time
- Classload time
- Runtime:Spring AOP default
- JoinPoint
- Aspect在應用程式執行時加入business流程的點或時機
- 時機
- 方法的調用
- class initialize
- 特定的異常被拋出
- Pointcut
- JoinPoint的assertion
- 指定某個Aspect在哪些Joinpoint時被應用至應用程式之上
- 根據method的名字或者正規表示式去攔截一個method
- 定義檔中撰寫Pointcut,當中說明了哪些Aspect要應用至應用程式中的哪些Joinpoint
- Advice
- 在Aspect的某個特定的Joinpoint上執行的動作
- Aspect的具體實作稱之為Advice
- LogHandler類別在AOP的術語就是Aspect的一個具體實例
- 使用Interceptor(攔截器)來實現Advice
- 類型
- before:method執行前的動作
- after:method執行後的動作
- around…
- 在Aspect的某個特定的Joinpoint上執行的動作
- Advisor
- Advice和Pointcut組成的獨立的單元,並且能夠傳給proxy
order
- spring aop就是一個同心圓,要執行的方法為圓心,最外層的order最小
- 從最外層按照AOP1、AOP2的順序依次執行doAround方法,doBefore方法
- 執行method方法
- 最後按照AOP2、AOP1的順序依次執行doAfter、doAfterReturn方法
舉例:資料庫操作
- 呼叫method
- 觸發runtime proxies的method
- 資料庫操作的method
- Transaction Management
- 利用Interceptor辨認為aspect
- Spring要對調用DAO的方法加以控制,所以就去找到對應的advice,去實作aspect
- 其他需要實作的aspect
- 根據Pointcut weave到相對應的JoinPoints
- 執行其他與資料庫操作無關的程式碼
沒有留言:
張貼留言