- 散佈在application多處的功能(如log, security, cache,...)被稱為cross-cutting concern
- 這些cross-cutting concern概念上通常會和業務邏輯分開,但往往又會直接嵌入到業務邏輯中
- 將這些cross-cutting concern和業務邏輯分離,正是AOP要解決的事情
- DI: Application object之間的decoupling
- AOP: cross-cutting concern和他們影響的object之間的decoupling
- AOP是什麼?
- Aspect oriented programming
- 能夠協助將cross-cutting concern模組化,如下圖為橫切服務的功能
- from spring in action 4
- 問題:若要使用相同的功能,通常使用inheritance, delegation
- inheritance: 若整個application都使用同一個base class,會導致脆弱的object
- delegate:需要對delegate對象進行複雜的呼叫
- 解法:
- AOP取代inheritance及delegate,且在很多場景下都簡潔
- 需要定義common functionality
- 可以定義function需要在哪裡被應用,不需要修改受影響的class
- cross-cutting concern可以被模組化成特殊的class,這些class稱為aspect
- 優勢:
- 每個concern都集中在同一個地方,而不是散到程式碼各處
- 主要的service module更簡潔,因為程式碼只包含主要的concern code,次要的concerns被轉移到aspects
- 定義AOP term
- advice (抄電表員紀錄用電量:工作)
- aspects的工作就叫做advice
- advice定義了aspects是什麼,且什麼時候使用
- 什麼時候使用:比如某個method前?後?前後都call?threw exception時用?
- Spring aspects可以使用五種type advices
- Before: target method前
- After: target method後
- After-returning: target method successfully 完成
- After-throwing: target method拋出exception的時候
- Around: advice wraps advice methods,在被通知的method call之前和之後執行自己定義的function
- join point (抄電表員目標就是房屋內那些安裝的電表)
- application執行過程中能夠insert join point的點
- join point可以是call method, throw exception,甚至是修改string
- aspect能夠insert join point到正常流程中,加入新的行為
- pointcut (抄電表員工作的範圍應該是有指定區域的)
- advice定義what&when,pointcut定義where
- 匹配advice所有織入(woven)的join cut
- 有些AOP framework允許創立dynamic pointcut,可以在runtime的時候決定是否apply advice
- aspect (抄電表員知道完成工作所需要的所有東西)
- advice與point cut的結合(what, where, when)
- introduction
- 可以將現有的ass加入新的method或property
- weaving
- aspect應用到target object並且創建新的proxy object的過程
- 在指定的join cut被weaving到target object
- 在target object可以有很多點進行weaving
- compile time: target class compile的時候被weaving,需要特殊的compiler如AspectJ
- class load time: target class被load到JVM的時候被weaving,需要特殊的class loader,AspectJ5的load-time weaving(LTW) support
- runtime: target class在runtime時weaving。一般情況下,weaving時AOP container會為target object dynamic創建一個proxy object。而Spring AOP就是這種方式
- Spring對AOP的support
- AOP framework基本功能:建立pointcuts,定義join points在哪個aspects需要被woven
- Spring提供四種type的AOP support
- classic Spring proxy-based AOP
- Pure-POJO aspects: 需要使用XML,藉由aop namespace轉換POJO為aspects
@AspectsJ: 可以不使用XML Injects AspectJ aspects: APO需求當不只有constructor, property的使用時,可以使用aspects implements AspectJ - Spring advice是Java寫出來的
- 定義advice用的pointcut通常會使用annotation或在Spring config file裡使用XML編寫
- AspectJ是以Java擴展的方式implement
- 優點:可以獲得更強大的控制
- 缺點:需要學期額外的新工作及語法
- Spring通知objects at runtime
- Spring only supports method join points
- 因為Spring是基於dynamic proxy,所以Spring指支援method的join points
- 如AspectJ, JBoss還提供field及constructor join points(因此Spring無法再bean create的時候使用advice)
- method join points可以滿足絕大部分的需求
2017年12月22日 星期五
Java Spring - AOP基本概念
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言