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