Java的Spring?AOP詳細(xì)講解
什么是AOP&作用
- AOP 為 Aspect Oriented Programming 的縮寫,意思為面向切面編程,是通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
- AOP 是 OOP 的延續(xù),是函數(shù)式編程的一種衍生范型。利用AOP可以對業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率
- 作用:在程序運(yùn)行期間,在不修改源碼的情況下對方法進(jìn)行功能增強(qiáng)
AOP的動(dòng)態(tài)代理技術(shù)
- 常用的動(dòng)態(tài)代理技術(shù)
1.JDK代理,基于接口的動(dòng)態(tài)代理
2.cglib代理,基于父類的動(dòng)態(tài)代理技術(shù)
基于JDK的動(dòng)態(tài)代理
動(dòng)態(tài)代理的實(shí)現(xiàn)
單獨(dú)實(shí)現(xiàn)增強(qiáng)方法
running方法
cglib動(dòng)態(tài)代理
不需要寫接口文件其他增強(qiáng)方法,目標(biāo)方法復(fù)制
AOP相關(guān)概念
Target(目標(biāo)對象):代理的目標(biāo)對象
Proxy (代理):一個(gè)類被 AOP 織入增強(qiáng)后,就產(chǎn)生一個(gè)結(jié)果代理類
Joinpoint(連接點(diǎn)):所謂連接點(diǎn)是指那些被攔截到的點(diǎn)。在spring中,這些點(diǎn)指的是方法,因?yàn)閟pring只支持方法類型的連接點(diǎn)
Pointcut(切入點(diǎn)):所謂切入點(diǎn)是指我們要對哪些 Joinpoint 進(jìn)行攔截的定義
Advice(通知/ 增強(qiáng)):所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知
Aspect(切面):是切入點(diǎn)和通知(引介)的結(jié)合
Weaving(織入):是指把增強(qiáng)應(yīng)用到目標(biāo)對象來創(chuàng)建新的代理對象的過程。spring采用動(dòng)態(tài)代理織入,而AspectJ采用編譯期織入和類裝載期織入
AOP開發(fā)明確事項(xiàng)
需要編寫的內(nèi)容
- 編寫業(yè)務(wù)核心代碼(目標(biāo)方法)
- 編寫切面類(增強(qiáng)功能方法)
- 在配置文件中。配置織入關(guān)系
AOP技術(shù)實(shí)現(xiàn)的內(nèi)容
Spring 框架監(jiān)控切入點(diǎn)方法的執(zhí)行。一旦監(jiān)控到切入點(diǎn)方法被運(yùn)行,使用代理機(jī)制,動(dòng)態(tài)創(chuàng)建目標(biāo)對象的代理對象,根據(jù)通知類別,在代理對象的對應(yīng)位置,將通知對應(yīng)的功能織入,完成完整的代碼邏輯運(yùn)行。
AOP 底層使用哪種代理方式
在 spring 中,框架會(huì)根據(jù)目標(biāo)類是否實(shí)現(xiàn)了接口來決定采用哪種動(dòng)態(tài)代理的方式(jdk是接口代理 cglib是不需要接口的)
基于XML的AOP開發(fā)
導(dǎo)入AOP相關(guān)坐標(biāo)
創(chuàng)建目標(biāo)接口和目標(biāo)類
創(chuàng)建切面類
將目標(biāo)類和切面類的對象創(chuàng)建權(quán)交給Spring
在applicationContext.xml中配置織入關(guān)系
測試代碼
切面表達(dá)式
- 表達(dá)式語法
execution([修飾符] 返回值類型 包名.類名.方法名(參數(shù)))
execution(public void com.itheima.aop.Target.method())
訪問修飾符可以省略
execution(void com.itheima.aop.Target.*(..))
包名與類名之間一個(gè)點(diǎn) . 代表當(dāng)前包下的類,兩個(gè)點(diǎn) … 表示當(dāng)前包及其子包下的類
execution(* com.itheima.aop.*.*(..))
參數(shù)列表可以使用兩個(gè)點(diǎn) … 表示任意個(gè)數(shù),任意類型的參數(shù)列表
execution(* com.itheima.aop..*.*(..))
通知類型
切點(diǎn)表達(dá)式抽取
基于注解的AOP開發(fā)
創(chuàng)建目標(biāo)接口和目標(biāo)類(內(nèi)部有切點(diǎn))
創(chuàng)建切面類(內(nèi)部有增強(qiáng)方法)
將目標(biāo)類和切面類的對象創(chuàng)建權(quán)交給Spring 在切面類中使用注解配置織入關(guān)系 在配置文件中開啟組件掃描和AOP自動(dòng)代理
測試
注解通知類型和切面表達(dá)式的抽取
類型
抽取表達(dá)式
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot disruptor高性能隊(duì)列使用
這篇文章主要介紹了SpringBoot disruptor高性能隊(duì)列使用,Disruptor是英國外匯交易公司LMAX開發(fā)的一個(gè)高性能隊(duì)列,研發(fā)的初衷是解決內(nèi)存隊(duì)列的延遲問題2023-02-02Java實(shí)現(xiàn)隊(duì)列的三種方法集合
這篇文章主要介紹了Java實(shí)現(xiàn)隊(duì)列的三種方法集合,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java面向?qū)ο蟪绦蛟O(shè)計(jì):抽象類,接口用法實(shí)例分析
這篇文章主要介紹了Java面向?qū)ο蟪绦蛟O(shè)計(jì):抽象類,接口用法,結(jié)合實(shí)例形式分析了java抽象類與接口相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-04-04Java實(shí)現(xiàn)鎖定某個(gè)變量的幾種方式示例詳解
這篇文章主要為大家介紹了Java實(shí)現(xiàn)鎖某個(gè)變量的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09解決Spring Cloud feign GET請求無法用實(shí)體傳參的問題
這篇文章主要介紹了解決Spring Cloud feign GET請求無法用實(shí)體傳參的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01