spring之AOP基本概念和配置詳解
首先我們來看一下官方文件所給我們的關於AOP的一些概念性詞語的解釋:
切面(Aspect):一個關注點的模組化,這個關注點可能會橫切多個物件。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。在Spring AOP中,切面可以使用基於模式)或者基於Aspect註解方式來實現。通俗點說就是我們加入的切面類(比如log類),可以這麼理解。
連線點(Joinpoint):在程式執行過程中某個特定的點,比如某方法呼叫的時候或者處理異常的時候。在Spring AOP中,一個連線點總是表示一個方法的執行。通俗的說就是加入切點的那個點
通知(Advice):在切面的某個特定的連線點上執行的動作。其中包括了“around”、“before”和“after”等不同型別的通知(通知的型別將在後面部分進行討論)。許多AOP框架(包括Spring)都是以攔截器做通知模型,並維護一個以連線點為中心的攔截器鏈。
切入點(Pointcut):匹配連線點的斷言。通知和一個切入點表示式關聯,並在滿足這個切入點的連線點上執行(例如,當執行某個特定名稱的方法時)。切入點表示式如何和連線點匹配是AOP的核心:Spring預設使用AspectJ切入點語法。
引入(Introduction):用來給一個型別宣告額外的方法或屬性(也被稱為連線型別宣告(inter-type declaration))。Spring允許引入新的介面(以及一個對應的實現)到任何被代理的物件。例如,你可以使用引入來使一個bean實現IsModified介面,以便簡化快取機制。
目標物件(Target Object): 被一個或者多個切面所通知的物件。也被稱做被通知(advised)物件。 既然Spring AOP是通過執行時代理實現的,這個物件永遠是一個被代理(proxied)物件。
AOP代理(AOP Proxy):AOP框架建立的物件,用來實現切面契約(例如通知方法執行等等)。在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。
織入(Weaving):把切面連線到其它的應用程式型別或者物件上,並建立一個被通知的物件。這些可以在編譯時(例如使用AspectJ編譯器),類載入時和執行時完成。Spring和其他純Java AOP框架一樣,在執行時完成織入。
通知型別:
前置通知(Before advice):在某連線點之前執行的通知,但這個通知不能阻止連線點之前的執行流程(除非它丟擲一個異常)。
後置通知(After returning advice):在某連線點正常完成後執行的通知:例如,一個方法沒有丟擲任何異常,正常返回。
異常通知(After throwing advice):在方法丟擲異常退出時執行的通知。
最終通知(After (finally) advice):當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。
環繞通知(Around Advice):包圍一個連線點的通知,如方法呼叫。這是最強大的一種通知型別。環繞通知可以在方法呼叫前後完成自定義的行為。它也會選擇是否繼續執行連線點或直接返回它自己的返回值或丟擲異常來結束執行。
環繞通知是最常用的通知型別。和AspectJ一樣,Spring提供所有型別的通知,我們推薦你使用盡可能簡單的通知型別來實現需要的功能。例如,如果你只是需要一個方法的返回值來更新快取,最好使用後置通知而不是環繞通知,儘管環繞通知也能完成同樣的事情。用最合適的通知型別可以使得程式設計模型變得簡單,並且能夠避免很多潛在的錯誤。比如,你不需要在JoinPoint上呼叫用於環繞通知的proceed()方法,就不會有呼叫的問題。
spring AOP的實現
在spring2.5中,常用的AOP實現方式有兩種。第一種是基於xml配置檔案方式的實現,第二種是基於註解方式的實現。接下來,以具體的示例來講解這兩種方式的使用。下面我們要用到的例項是一個註冊,就有使用者名稱和密碼,我們利用AOP來實現在使用者註冊的時候實現在儲存資料之前和之後或者是丟擲異常時,在這些情況下都給他加上日誌。在這裡我們只講解AOP,所以我只把關鍵程式碼貼出來,不相干的就不貼了。
首先我們來看一下業務邏輯service層:
對於業務系統來說,RegisterServiceImpl類就是目標實現類,它的業務方法,如save()方法的前後或程式碼會出現異常的地方都是AOP的連線點。
下面是日誌服務類的程式碼:
這個類屬於業務服務類,如果用AOP的術語來說,它就是一個切面類,它定義了許多通知。Before()、afterReturn()、after()和afterThrowing()這些方法都是通知。
下面我們就來看具體配置,首先來看一下:
<1>.基於xml配置檔案的AOP實現:這種方式在實現AOP時,有4個步驟。
上述配置針對切入點應用了前置、後置、最終,以及丟擲異常後通知。這樣在測試執行RegisterServiceImpl類的save()方法時,控制檯會有如下結果輸出:
前置通知:com.zxf.service.RegisterServiceImpl類的save方法開始了。
針對MySQL的RegisterDao實現中的save()方法。
後置通知:方法正常結束了。
最終通知:不管方法有沒有正常執行完成,一定會返回的。
下面我們在來看一下第二種配置方式:
<2>基於註解的AOP的實現
首先建立一個用來作為切面的類LogAnnotationAspect,同時把這個類配置在spring的配置檔案中。
在spring2.0以後引入了JDK5.0的註解Annotation的支援,提供了對AspectJ基於註解的切面的支援,從而 更進一步地簡化AOP的配置。具體的步驟有兩步。
Spring的配置檔案是如下的配置:
這是那個切面的類LogAnnotationAspect
備註:輸出結果和前面的一樣。
相關文章
- Spring AOP 詳解Spring
- 死磕Spring之AOP篇 - Spring AOP註解驅動與XML配置SpringXML
- Spring Aop 詳解二Spring
- Spring Aop 詳解一Spring
- 死磕Spring之AOP篇 - Spring 事務詳解Spring
- Spring AOP及事務配置三種模式詳解Spring模式
- Spring框架系列(10) - Spring AOP實現原理詳解之AOP代理的建立Spring框架
- Spring框架系列(9) - Spring AOP實現原理詳解之AOP切面的實現Spring框架
- Spring AOP全面詳解(超級詳細)Spring
- Spring AOP中的前置通知和後置通知詳解Spring
- Spring基於註解的aop配置Spring
- [Spring之AOP]Spring
- Spring框架系列(12) - Spring AOP實現原理詳解之JDK代理實現Spring框架JDK
- Spring框架系列(11) - Spring AOP實現原理詳解之Cglib代理實現Spring框架CGLib
- spring 詳細講解(ioc,依賴注入,aop)Spring依賴注入
- 死磕Spring之AOP篇 - Spring AOP總覽Spring
- Spring 3.0 AOP 之 AOP 術語 (一)Spring
- Spring-Aop詳細教程Spring
- spring ioc和aopSpring
- Spring原始碼剖析7:AOP實現原理詳解Spring原始碼
- Spring 面向切面程式設計AOP 詳細講解Spring程式設計
- Spring之AOP實現Spring
- Spring之Aop練習Spring
- (002)Spring 之 AOPSpring
- Spring 配置檔案詳解Spring
- spring配置檔案詳解Spring
- 死磕Spring之AOP篇 - Spring AOP常見面試題Spring面試題
- 從XML配置角度理解Spring AOPXMLSpring
- Docker基本概念詳解Docker
- Spring系列之aAOP AOP是什麼?+xml方式實現aop+註解方式實現aopSpringXML
- 死磕Spring之AOP篇 - Spring AOP自動代理(一)入口Spring
- Spring(環境搭建&配置詳解)Spring
- spring xml配置標籤詳解SpringXML
- Spring Boot之IOC&AOPSpring Boot
- Spring框架系列之AOP思想Spring框架
- Spring AOP之原始碼分析Spring原始碼
- Spring JdbcTemplate之使用詳解SpringJDBC
- Java之Spring Boot詳解JavaSpring Boot