1. 程式人生 > 實用技巧 >Spring AOP&AspectJ

Spring AOP&AspectJ

Spring AOP&AspectJ

目錄

AOP是什麼?

知道概念的可以跳過這一節。

旨在將橫切關注點與業務主體進行進一步分離,以提高程式程式碼的模組化程度。通過在現有程式碼基礎上增加額外的通知(Advice)機制,能夠對被宣告為切點(Pointcut)的程式碼塊進行統一管理與裝飾,如“對所有方法名以‘set*’開頭的方法新增後臺日誌”。該思想使得開發人員能夠將與程式碼核心業務邏輯關係不那麼密切的功能(如日誌功能)新增至程式中,同時又不降低業務程式碼的可讀性。面向切面的程式設計思想也是面向切面軟體開發的基礎。

面向切面的程式設計將程式碼邏輯切分為不同的模組(即關注(Concern),一段特定的邏輯功能)。幾乎所有的程式設計思想都涉及程式碼功能的分類,將各個關注點封裝成獨立的抽象模組(如函式、過程、模組、類以及方法等),後者又可供進一步實現、封裝和重寫。部分關注點“橫切”程式程式碼中的數個模組,即在多個模組中都有出現,它們即被稱作橫切關注(Cross-cutting concerns, Horizontal concerns)”>。

日誌功能即是橫切關注點的一個典型案例,因為日誌功能往往橫跨系統中的每個業務模組,即“橫切”所有有日誌需求的類及方法體。而對於一個信用卡應用程式來說,存款、取款、帳單管理是它的核心關注點,日誌和持久化將成為橫切整個物件結構的橫切關注點。

AOP 概念

知道概念的可以跳過這一節。

  • Join point:連線點 在程式執行期間的一個點,一般是指你要觀察的方法。

  • Advice:通知 在JoinPoint處所要採取的操作

  • Pointcut:切入點 Advice和切入點表示式關聯,然後在AOP中就可以用來代替JoinPoint

  • Introduction: 引入 代表一個型別宣告額外的方法或欄位。

  • Target object:一個或多個方面建議的物件。也稱為“建議物件”。由於springaop是通過使用執行時代理來實現的,所以這個物件始終是一個代理物件。

  • Weaving: 織入 將方面與其他應用程式型別或物件連結以建立建議的物件。這可以在編譯時(例如使用AspectJ編譯器)、載入時或執行時完成。springaop和其他純javaaop框架一樣,在執行時執行編織。

  • AOP proxy:AOP框架為實現方面契約(advice方法執行等)而建立的物件。在Spring框架中,AOP代理是JDK動態代理或CGLIB代理。

Advice 註解

  1. @Before前置通知:advice在joinpoint之前執行,但是不能阻止執行jointpoint,除非丟擲了ex
  2. @After後置通知:不管joinpoint是否正常結束,advice都會被執行。
  3. @AfterReturning返回通知:在jointpoint完全正常執行後執行
  4. @AfterThrowing異常通知:如果方法出現ex,advice就會被執行
  5. @Around環繞通知:環繞在方法的前後呼叫。可以支援在方法呼叫的前後做自定義的操作。還負責是繼續返回自己的值還是引發ex

Spring AOP

Spring AOP可以認為是spring框架中解決了部分問題的優秀框架,但是還是有些情況下不能支援。

Spring AOP主要目的是實現AOP和SpringIOC的整合,用來解決一些應用的常見問題。

因此,例如,Spring框架的AOP功能通常與SpringIOC容器一起使用。方面是使用普通的bean定義語法配置的(儘管這允許強大的“自動代理”功能)。這是與其他AOP實現的關鍵區別。使用SpringAOP,您無法輕鬆或高效地完成某些事情,例如advice非常細粒度的物件(通常是域物件)。在這種情況下,AspectJ是最好的選擇。然而,SpringAOP為企業Java應用程式中的大多數問題提供了一個很好的解決方案。

Aop 代理

Spring AOP預設是用標準JDK動態代理,這樣可以代理任何介面。但是如果沒有介面,就只能使用CGLIB代理,但是對於final是不能代理的,就只能用AspectJ

當然功能更為強大的要數AspectJ元件。

一般來說spring下都是使用JDK 動態代理,如果強制使用CGLIB,就要在配置檔案中加入

<aop:config proxy-target-class="true">
    <!-- other beans defined here... -->
</aop:config>

引用: