2017年12月22日 星期五

Java Spring - AOP基本概念


  • 散佈在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
        1. Before: target method前
        2. After: target method後
        3. After-returning: target method successfully 完成
        4. After-throwing: target method拋出exception的時候
        5. 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
      1. classic Spring proxy-based AOP
      2. Pure-POJO aspects: 需要使用XML,藉由aop namespace轉換POJO為aspects
      3. @AspectsJ: 可以不使用XML
      4. 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可以滿足絕大部分的需求

沒有留言:

張貼留言