摘要:概念傻傻分不清是一種面向切面的編程思想,最小單位是切面是基于的編程思想,最小單位是類。聯(lián)盟為的實(shí)現(xiàn)提出了多種方案,主要有基于攔截的直接修改字節(jié)碼的??珊雎韵葋碚f說中,的幾個(gè)主要概念切面切入點(diǎn)連接點(diǎn)建議增強(qiáng)開始暈了深吸一口氣,慢慢往下看。
AOP概念?傻傻分不清?
AOP是一種面向切面的編程思想,最小單位是切面;Java是基于OOP的編程思想,最小單位是類。
雖然思想不同,但是AOP卻能夠給Java提供強(qiáng)大的加持,Spring AOP的應(yīng)用就是最好的例子。
AOP思想是如此優(yōu)秀,所以在一開始,就有人嘗試建立組織來統(tǒng)一規(guī)范,這個(gè)組織就是AOP聯(lián)盟。AOP聯(lián)盟為AOP的實(shí)現(xiàn)提出了多種方案,主要有:基于攔截的(Interceptor)、直接修改字節(jié)碼的。(可忽略)
先來說說Spring中,AOP的幾個(gè)主要概念:
切面、切入點(diǎn)、連接點(diǎn)、建議(增強(qiáng))
開始暈了... 深吸一口氣,慢慢往下看。一般我們做事情,時(shí)間、地點(diǎn)、人物、做什么缺一不可,那么我們看看這些是如何對應(yīng)的。
Spring AOP的設(shè)計(jì)是遵循AOP聯(lián)盟的。AOP聯(lián)盟中有兩個(gè)主要概念:Advice、JoinPoint
Advice:增強(qiáng),這個(gè)比較好理解,就是想要增加的功能,比如:上下包裹一個(gè)事務(wù)、日志打印等,我們把它對應(yīng)為 "What" JoinPoint:行話叫:程序"運(yùn)行點(diǎn)"。什么意思呢?就是當(dāng)代碼運(yùn)行到需要執(zhí)行Advice時(shí)的那個(gè)地方的信息,注意是運(yùn)行時(shí)狀態(tài),且結(jié)尾是"的信息"(是一個(gè)名詞),我們把它對應(yīng)為"Who"
Spring引入了這兩個(gè)概念,并對Advice作了增強(qiáng)實(shí)現(xiàn):
@Before、@After、@Around等等:行話分別是前置增強(qiáng)、后置增強(qiáng)、環(huán)繞增強(qiáng), 主要負(fù)責(zé)控制"Advice"是在方法前還是方法后等哪個(gè)范圍執(zhí)行,我們把它對應(yīng)為 "When+Advice=> When + What"
但是單單這兩個(gè)還是不夠的,Spring另外提供了概念:
Pointcut:行話叫切入點(diǎn),實(shí)際上是`Spring`抽象出來的,用來`查找哪些`需要進(jìn)行增強(qiáng)的接口,我們把它對應(yīng)為"Where"
這些概念連起來,意思就是我要在哪里(Pointcut)什么時(shí)候(@Before)對誰(JoinPoint)做什么(Advice)。
看起來好像理解了,但是有感覺還是有點(diǎn)混亂,好多概念,好亂,還是好亂...
這時(shí)候,Spring出手了,他也覺得有點(diǎn)亂,怎么辦呢?
Advisor出現(xiàn)了,看看它的構(gòu)造:
沒錯(cuò)!Spring將Advice和Pointcut兩個(gè)封裝起來了,就叫Advisor。一個(gè)Advisor就能夠確定什么時(shí)間地做什么,構(gòu)造它需要:Advice + Pointcut。
看看在XMl中一個(gè)Advisor的定義:
了解了這些還不夠,剩下一個(gè)概念Aspect。實(shí)際上,Aspect是一個(gè)虛的概念,它代表了一系列的Advisor,也就是說,一個(gè)Aspect其實(shí)等于:
他他他要在哪里(Pointcut)什么時(shí)候(@Before)對誰(JoinPoint)做什么(Advice) 她她她要在哪里(Pointcut)什么時(shí)候(@Before)對誰(JoinPoint)做什么(Advice) 它它它要在哪里(Pointcut)什么時(shí)候(@Before)對誰(JoinPoint)做什么(Advice)
看看一個(gè)Aspect的定義
完畢!
隱隱約約還有什么東西漏下了?沒錯(cuò)!就是Pointcut,前面說過,這個(gè)是運(yùn)行時(shí)的對象,是對Who的抽象,代碼:
Pointcut對象,在程序執(zhí)行到要增強(qiáng)的地方時(shí),被封裝好傳入進(jìn)來,要不要使用取決于自己(除非是Around),他代表了當(dāng)時(shí)的上下文信息,就是一個(gè)在現(xiàn)場者。
整片文章總結(jié)下來就是:
我要定義一個(gè)切面(Aspect),但是切面是虛的,只是定義用來代表一到多個(gè)Advisor,那我要先定義一個(gè)Advisor,Advisor是表示 要做什么+在哪里做,那就定義Advice->做什么,定義Pointcut->在哪里做,也就是說: Aspect => n * Advisor => n * ( Advice + Pointcut) == n * (@Before/@After/@Around + Pointcut) 完畢!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73737.html
摘要:具體的動(dòng)態(tài)代理運(yùn)行原理這里暫不展開,網(wǎng)上有很多相關(guān)的內(nèi)容,比如這篇翻譯過來就是面向方面切面編程。所以切面可以理解為和的集合。 1.靜態(tài)代理 在提及動(dòng)態(tài)代理前先說明一下靜態(tài)代理模式,靜態(tài)代理模式是一種很常見的通用設(shè)計(jì)模式,實(shí)現(xiàn)也很簡單,uml類圖如下: showImg(https://segmentfault.com/img/bVba3gn?w=737&h=312); 如上圖所示,代理類...
摘要:在寫完容器源碼分析系列文章中的最后一篇后,沒敢懈怠,趁熱打鐵,花了天時(shí)間閱讀了方面的源碼。從今天開始,我將對部分的源碼分析系列文章進(jìn)行更新。全稱是,即面向切面的編程,是一種開發(fā)理念。在中,切面只是一個(gè)概念,并沒有一個(gè)具體的接口或類與此對應(yīng)。 1. 簡介 前一段時(shí)間,我學(xué)習(xí)了 Spring IOC 容器方面的源碼,并寫了數(shù)篇文章對此進(jìn)行講解。在寫完 Spring IOC 容器源碼分析系列...
摘要:,,面向切面編程。,切點(diǎn),切面匹配連接點(diǎn)的點(diǎn),一般與切點(diǎn)表達(dá)式相關(guān),就是切面如何切點(diǎn)。例子中,注解就是切點(diǎn)表達(dá)式,匹配對應(yīng)的連接點(diǎn),通知,指在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。,織入,將作用在的過程。因?yàn)樵创a都是英文寫的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細(xì)講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動(dòng)態(tài)代理嗎?看這篇就夠了》介紹了下...
摘要:注意前一節(jié)我們的代理是對對象進(jìn)行了代理,而的可以基于方法進(jìn)行代理,因?yàn)轭惖膶傩院头椒ǘ加邢鄳?yīng)的類來描述或者對應(yīng)屬性由的表示,方法由來表示這里說幾個(gè)的接口或類切入點(diǎn)用來說明是對哪些類的哪些方法進(jìn)行橫切就是被代理的對象的一個(gè)集合說明對哪些類進(jìn)行 注意: 前一節(jié)我們的代理是對對象進(jìn)行了代理,而spring 的AOP 可以基于方法進(jìn)行代理,因?yàn)轭惖膶傩院头椒ǘ加邢鄳?yīng)的類來描述或者對應(yīng) 屬性由j...
摘要:基本知識其實(shí)接觸了這么久的我感覺給人難以理解的一個(gè)關(guān)鍵點(diǎn)是它的概念比較多而且坑爹的是這些概念經(jīng)過了中文翻譯后變得面目全非相同的一個(gè)術(shù)語在不同的翻譯下含義總有著各種莫名其妙的差別鑒于此我在本章的開頭著重為為大家介紹一個(gè)的各項(xiàng)術(shù)語的基本含義為了 基本知識 其實(shí), 接觸了這么久的 AOP, 我感覺, AOP 給人難以理解的一個(gè)關(guān)鍵點(diǎn)是它的概念比較多, 而且坑爹的是, 這些概念經(jīng)過了中文翻譯后...
閱讀 854·2021-11-15 17:58
閱讀 3658·2021-11-12 10:36
閱讀 3793·2021-09-22 16:06
閱讀 968·2021-09-10 10:50
閱讀 1333·2019-08-30 11:19
閱讀 3317·2019-08-29 16:26
閱讀 942·2019-08-29 10:55
閱讀 3349·2019-08-26 13:48