淺析Spring AOP(一)——基本概念


什么是AOP?

與OOP對比,AOP是處理一些橫切行問題。這些橫切性問題不會影響到主邏輯的實現,但是會散落到代碼的各個部分,難以維護。AOP就是把這些問題和主業務邏輯分開,達到與主業務邏輯解耦的目的。

傳統OOP是自上而下的邏輯開發;

OOP: 


 

AOP是一種面向切面的編程思想。這些橫切性問題,把它們抽象為一個切面,關注點在切面的編程,這就是所謂的AOP。

 AOP關注點是橫切性問題:


 

 

Spring AOP 簡介

如果說 IoC 是 Spring 的核心,那么面向切面編程就是 Spring 最為重要的功能之一了,在數據庫事務中切面編程被廣泛使用。

AOP應用場景:

日志記錄,權限驗證,效率檢查,事務管理......

學習Spring最好的方式是從spring官方文檔入手.

AOP中的一些基本概念:

必須先知道這些基礎概念,要不后面看得一臉懵逼。

官網:AOP


官網一開始給出的概念

個人認為理解順序應該為:

Join point:連接點,例如:servlet中的longin()就是連接點;所以連接點在spring中它永遠是一個方法。也可以說'目標對象中的方法就是一個連接點‘。

pointcut:切點,就是連接點的集合!

Weaving:織入;

這個過程叫做織入(Weaving):


 

Advice:通知,就字面意思,但是有2個部分組成,通知內容和通知到哪里去。

通知類型:

Before :前置通知,在連接點方法前調用

After :后置通知,在連接點方法后調用

AfterReturning:返回通知,在連接點方法執行並正常返回后調用,要求連接點方法在執行過程中沒有發生異常

AfterThrowing:異常通知,當連接點方法異常時調用

Around:環繞通知,它將覆蓋原有方法,但是允許你通過反射調用原有方法,后面會講

Aspect:切面!包括連接點,切點,通知的一個載體。(如果用AspectJ它就是一個類,如果用springXML的時候它就是一個標簽)並且交給spring管理。

Target object:目標對象,原始對象。

AOP proxy:代理對象, 包含了原始對象的代碼和增強后的代碼的那個對象。

Introduction:引入,個人理解為實現接口;

代碼驗證為:

@DeclareParents(value="com.vince.dao.*", defaultImpl=IndexDao.class)

public static Dao dao;

com.vince.dao.*下的所有類默認實現了IndexDao.class

 


概念理解

切點匹配表達式

切點匹配表達式:

execution:可以定義到方法的的最小粒度是參數的返回類型,修飾符,包名,類名,方法名,Spring AOP主要也是使用這個匹配表達式。

within:只能定義到類

this:當前生成的代理對象的類型匹配

target:目標對象類型匹配

args:只針對參數

execution和within的區別:

他們的主要區別就是粒度,within主要是輔助,為了健全而存在的。

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)   throws-pattern?)

  方法的可見性(不寫代表所有)?方法的返回類型  方法所在類的全路徑名 ?方法名類型(方法的參數類型) 方法拋出的異常類型?

如果看的一臉懵逼....就借助代碼理解一下。

舉個栗子:

本篇只用到注解的方式:

首先引入包:

引入包:


 

代碼:

切面1-1:


切面1-2:

 
 

 dao:


 

 掃描:


 

 測試類:


 

只開啟了beforeWithin()和beforeExecution()這兩個通知

測試結果:


 

結果可以看出beforeExecution匹配了2個切入點,而beforeWithin匹配了全部的切入點。如需測試代碼可以私信。

AOP的內容非常多,本文主要介紹了SpringAOP的一些基礎概念。

參考資料:

感覺寫得超級好:Spring(4)——面向切面編程(AOP模塊)

官網:AOP


本人才疏學淺,以上純屬個人理解,如有不對,還望批評指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM