javascript
Spring AOP(面向切面)
文章目錄
- SpringAOP簡介:
- 與OOP對比:
- 優點:
- 應用場景:
- AOP術語:
- 切面(Aspect) :
- 切入點 (Pointcut)
- 連接點(Join point):
- 切入點(Pointcut):
- 通知(Advice):
- 環繞通知(around)
- 前置通知(before)
- 后置(返回值)通知(after returning)
- 異常通知(after throwing)
- 后置(最終)通知 (after)
- 織入(Weaving):
- AOP使用
- 添加依賴包
- XML方式
- 配置
- 切入點表達式
SpringAOP簡介:
與OOP對比:
面向對象編程OOP(Object Oriented Programming)語言提供了類與類之間縱向的關系(繼承、接口),
而面向切面編程AOP(Aspect Oriented Programming)補充了橫向的關系。
AOP提供了切面,切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理(這些關注點術語通常稱作橫切(crosscutting)關注點)。
優點:
AOP提供了強大的中間件解決方案,這使得Spring IOC更加完善。
應用場景:
我們可以通過AOP來實現日志監聽,事務管理,權限控制等等。
AOP術語:
切面(Aspect) :
我們將自己需要插入到目標業務邏輯中的代碼模塊化, 通過AOP使之可以橫切多個類的模塊,稱之為切面。
在Spring AOP中,切面可以使用通過類(基于模式(XML)的風格)或者在普通類中以@Aspect注解(AspectJ風格)來實現。
在Spring AOP配置中切面通常包含三部分:
- 切面模塊本身
- 通知
- 切入點
切入點 (Pointcut)
在 Spring AOP 中,需要使用 AspectJ 的切點表達式來定義切點。
連接點(Join point):
程序執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。在Spring AOP中一個連接點總是代表一個方法的執行。個人理解:AOP攔截到的方法就是一個連接點。通過聲明一個org.aspectj.lang.JoinPoint類型參數我們可以在通知(Advice)中獲得連接點的信息。這個在稍后會給出案例。
切入點(Pointcut):
匹配連接點(Join point)的斷言。通知(Advice)跟切入點表達式關聯,并在與切入點匹配的任何連接點上面運行。
切入點表達式如何跟連接點匹配是AOP的核心,Spring默認使用AspectJ作為切入點語法。
通過切入點的表達式來確定哪些方法要被AOP攔截,
| execution () | 用于匹配連接點的執行方法 最常用 |
| args () | 限制連接點的指定參數為指定類型的執行方法 |
| @args () | 限制連接點匹配參數類型由指定注解標注的執行方法 |
| this () | 限制連接點匹配 AOP 代理的 Bean 引用為指定類型的類 |
| target () | 限制連接點匹配特定的執行對象,目標對象是指定的類型 |
| @target () | 限制連接點匹配特定的執行對象,這些對象對應的類要具備指定類型注解 |
| within() | 限制連接點匹配指定類型,比如哪個包下,或哪個類里面 |
| @within() | 限制連接點匹配指定注釋所標注的類型(當使用 Spring AOP 時,方法定義在由指定的注解所標注的類里) |
| @annotation | 限制匹配帶有指定注釋的連接點 |
通知(Advice):
在切面(Aspect)的某個特定連接點上(Join point)執行的動作。
許多AOP框架,包括Spring 都是以攔截器作為通知的模型,并維護一個以連接點為中心的攔截器鏈。
總之就是AOP對連接點的處理通過通知來執行。
Advice指當一個方法被AOP攔截到的時候要執行的代碼。
環繞通知(around)
- 在目標方法執行前、后被通知, 可以獲取連接點對象(ProceedingJoinPoint, 該對象可以獲取被攔截方法的簽名、參數、返回值、包括調用與否)
- 該方法的返回值,即代表了真正業務邏輯代碼的返回值
- 可以選擇終止或正常執行目標方法
前置通知(before)
在目標方法調用前通知切面, 什么參數也無法獲取。也不能終止目標方法執行
后置(返回值)通知(after returning)
只有在目標方法正常 執行結束后才會通知, 在通知方法中可以獲取到方法的返回值
異常通知(after throwing)
只有在目標方法 出現異常 才會通知, 在通知方法中可以獲取到拋出的異常信息
后置(最終)通知 (after)
在目標方法執行結束后通知切面, 什么參數也無法獲取。無論目標方法是正常執行結束還是拋出異常終止,都會被通知
織入(Weaving):
將 Aspect 和其他對象連接起來, 并創建 Adviced object 的過程
把切面(aspect)連接到其他的應用程序類型或者對象上,并創建一個被通知對象。這些可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。Spring和其他純AOP框架一樣,在運行時完成織入。
織入的過程其實就是把切面跟對象關聯并創建該對象的代理對象的過程。
織入的過程其實就是Spring AOP幫我們把切面中的代碼織入到目標代碼中的過程。
AOP使用
添加依賴包
<!-- Spring IOC最小依賴是beans、context,我們引入context依賴,maven會自動將beans依賴一并引入 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.framework.version}</version></dependency> <!--aop插件--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>XML方式
<!-- 目標業務邏輯代碼 --> <bean id="calc" class="com.lanou3g.spring.simple.calc.CalcImpl"/><!-- 切面模塊化對象(代表我們要附加到原始業務邏輯中的代碼) --> <bean id="calcAspect" class="com.lanou3g.spring.simple.calc.CalcAspect" /><!-- 將切面calcAspect中的代碼插入到calc原始業務代碼中 --> <aop:config><!-- 定義公用的切入點表達式,如果aspect中有多個通知,都可以通過pointcut-ref復用 --><aop:pointcut id="all_calc_method" expression="execution(* com.lanou3g.spring.simple.calc.CalcImpl.*(..))" /><aop:aspect ref="calcAspect"><!-- 切面包含的通知(什么時間)、切入點(什么地點) --><aop:around method="computeTime" pointcut-ref="all_calc_method" /></aop:aspect> </aop:config>配置aop:config
Spring 的 AOP 配置元素簡化了基于 POJO 切面聲明
| aop : advisor | 定義 AOP 通知器 |
| aop : after | 定義 AOP 后置通知(不管被通知方法是否執行成功) |
| aop : after-returing | 定義 AOP after-returing 通知 |
| aop : after-throwing | 定義 AOP after-throwing 通知 |
| aop : around | 定義 AOP 環繞通知 |
| aop : aspect | 定義切面 |
| aop : before | 定義 AOP 前置通知 |
| aop : config | 頂層的 AOP 配置元素,大多數 aop : * 元素必須包含在 元素內 |
| aop : declare-parents | 為被通知的對象引入額外接口,并透明的實現 |
| aop : pointcut | 定義切點 |
切入點表達式
*:匹配任何數量字符;
. .:匹配任何數量字符的重復,如在類型模式中匹配任何數量子包;而在方法參數模式中匹配任何數量參數。
+:匹配指定類型的子類型;僅能作為后綴放在類型模式后邊。
使用 且(&&)、或(||)、非(!)來組合切入點表達式。
由于在XML中使用“&&”需要使用轉義字符“&&”來代替之,
總結
以上是生活随笔為你收集整理的Spring AOP(面向切面)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 完美适配Windows 11,搜狗输入法
- 下一篇: 【平差软件学习---科傻】三、平面导线平