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