3幅圖讓你瞭解Spring AOP

       AOP(Aspect Oriented Programming),是面向切面編程的技術。AOP基於IoC基礎,是對OOP的有益補充。正則表達式


       AOP之因此能獲得普遍承認,主要是由於它將應用系統拆分分了2個部分:核心業務邏輯(Core business concerns)及橫向的通用邏輯,也就是所謂的切面Crosscutting enterprise concerns。例如,全部大中型應用都要涉及到的持久化管理(Persistent)、事務管理(Transaction Management)、權限管理(Privilege Management)、日誌管理(Logging)和調試管理(Debugging)等。使用AOP技術,可讓開發人員只專一核心業務,而通用邏輯則使用AOP技術進行橫向切入,由專人去處理這些通用邏輯,會使得任務簡單明瞭,提升開發和調試的效率。spring



基本概念

       要想了解AOP,首先得了解幾個重要的基本概念:編程

  • 切面(Aspect):一個關注點的模塊化,這個關注點實現可能另外橫切多個對象。好比說事務管理就是J2EE應用中一個很好的橫切關注點例子。切面用Spring的Advisor或攔截器實現。
    框架

  • 鏈接點(Joinpoint):程序執行過程當中明確的點,如方法的調用或特定的異常被拋出。
    模塊化

  • 通知(Advice):在特定的鏈接點,AOP框架執行的動做。各類類型的通知包括「around」、「before」和「throws」通知。通知類型將在下面討論。許多AOP框架包括Spring都是以攔截器作通知模型,維護一個「圍繞」鏈接點的攔截器鏈。
    spa

  • 切入點(Pointcut):指定一個通知將被引起的一系列鏈接點的集合。AOP框架必須容許開發者指定切入點,例如,使用正則表達式。代理

  • 目標對象(Target Object):包含鏈接點的對象,也被稱做被通知或被代理對象。
    調試

  • AOP代理(AOP Proxy):AOP框架建立的對象,包含通知。在Spring中,AOP代理能夠是JDK動態代理或CGLIB代理。日誌

  • 編織(Weaving):組裝方面來建立一個被通知對象。這能夠在編譯時完成(例如使用AspectJ編譯器),也能夠在運行時完成。Spring和其餘純Java AOP框架同樣,在運行時完成織入。orm


各類通知(Advice)類型

       爲了符合各類流程處理,通知類型提供了5種,能夠對目標方法進行全方位處理:

  • Before advice:在某鏈接點(JoinPoint)以前執行的通知,但這個通知不能阻止鏈接點前的執行。
    ApplicationContext中在<aop:aspect>裏面使用<aop:before>元素進行聲明。

  • After advice:當某鏈接點退出的時候執行的通知(不管是正常返回仍是異常退出)。
    ApplicationContext中在<aop:aspect>裏面使用<aop:after>元素進行聲明。

  • After returnadvice:在某鏈接點正常完成後執行的通知,不包括拋出異常的狀況。
    ApplicationContext中在<aop:aspect>裏面使用<aop:after-returning>元素進行聲明。

  • Around advice:包圍一個鏈接點的通知,相似Web中Servlet規範中的Filter的doFilter方法。能夠在方法的調用先後完成自定義的行爲,也能夠選擇不執行。
    ApplicationContext中在<aop:aspect>裏面使用<aop:around>元素進行聲明。

  • Afterthrowing advice:在方法拋出異常退出時執行的通知。
    ApplicationContext中在<aop:aspect>裏面使用<aop:after-throwing>元素進行聲明。

(經博友提醒,將上圖改爲此圖,是否是比上圖印象更深入一下,這兩張圖算一幅圖)


AOP 2種代理的區別

       AOP支持2種代理,Jdk的動態代理和CGLIB實現機制。兩者有什麼區別呢:

  • Jdk基於接口實現:JDK動態代理對實現了接口的類進行代理。

  • CGLIB基於繼承:CGLIB代理能夠對類代理,主要對指定的類生成一個子類,由於是繼承,因此目標類最好不要使用final聲明。 

       一般狀況下,鼓勵使用jdk代理,由於業務通常都會抽象出一個接口,並且不用引入新的東西。若是是遺留的系統,之前沒有實現接口,那麼只能使用CGLIB。


       下篇博文,會實踐一下spring aop,敬請期待。

相關文章
相關標籤/搜索