AOP概念?傻傻分不清?編程
AOP
是一種面向切面的編程思想,最小單位是切面;Java
是基於OOP
的編程思想,最小單位是類。
雖然思想不一樣,可是AOP
卻可以給Java
提供強大的加持,Spring AOP
的應用就是最好的例子。AOP
思想是如此優秀,因此在一開始,就有人嘗試創建組織來統一規範,這個組織就是AOP聯盟。AOP聯盟
爲AOP
的實現提出了多種方案,主要有:基於攔截的(Interceptor)
、直接修改字節碼的。(可忽略)
先來講說Spring
中,AOP
的幾個主要概念:spa
切面、切入點、鏈接點、建議(加強)
開始暈了... 深吸一口氣,慢慢往下看。通常咱們作事情,時間、地點、人物、作什麼缺一不可,那麼咱們看看這些是如何對應的。Spring AOP
的設計是遵循AOP聯盟
的。AOP聯盟
中有兩個主要概念:Advice、JoinPoint
.net
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
出現了,看看它的構造:code
沒錯!Spring
將Advice
和Pointcut
兩個封裝起來了,就叫Advisor
。一個Advisor
就可以肯定什麼時間地作什麼,構造它須要:Advice + Pointcut
。
看看在XMl中一個Advisor
的定義:對象
瞭解了這些還不夠,剩下一個概念Aspect
。實際上,Aspect
是一個虛
的概念,它表明了一系列的Advisor
,也就是說,一個Aspect
其實等於:blog
他他他要在哪裏(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) 完畢!