Advice?Pointcut?Aspect?JoinPoint?Advisor?

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

clipboard.png

沒錯!SpringAdvicePointcut兩個封裝起來了,就叫Advisor。一個Advisor就可以肯定什麼時間地作什麼,構造它須要:Advice + Pointcut
看看在XMl中一個Advisor的定義:對象

clipboard.png
瞭解了這些還不夠,剩下一個概念Aspect。實際上,Aspect是一個的概念,它表明了一系列的Advisor,也就是說,一個Aspect其實等於:blog

他他他要在哪裏(Pointcut)何時(@Before)對誰(JoinPoint)作什麼(Advice)
她她她要在哪裏(Pointcut)何時(@Before)對誰(JoinPoint)作什麼(Advice)
它它它要在哪裏(Pointcut)何時(@Before)對誰(JoinPoint)作什麼(Advice)

看看一個Aspect的定義接口

clipboard.png
完畢!事務

隱隱約約還有什麼東西漏下了?沒錯!就是Pointcut,前面說過,這個是運行時的對象,是對Who的抽象,代碼:

clipboard.png
Pointcut對象,在程序執行到要加強的地方時,被封裝好傳入進來,要不要使用取決於本身(除非是Around),他表明了當時的上下文信息,就是一個在現場者。

整片文章總結下來就是:

我要定義一個切面(Aspect),可是切面是虛的,只是定義用來表明一到多個Advisor,那我要先定義一個Advisor,Advisor是表示 要作什麼+在哪裏作,那就定義Advice->作什麼,定義Pointcut->在哪裏作,也就是說:
Aspect 
    => n * Advisor 
    => n * ( Advice + Pointcut) == n * (@Before/@After/@Around + Pointcut) 
完畢!

clipboard.png

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息