首頁  >  文章  >  Java  >  細說Spring——AOP詳解(AOP概覽)

細說Spring——AOP詳解(AOP概覽)

(*-*)浩
(*-*)浩轉載
2019-09-11 16:33:111993瀏覽

一、對AOP的初印象

細說Spring——AOP詳解(AOP概覽)

#先給一段比較專業的術語(來自百度) :

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一
维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利
用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效
率。

後我們舉一個比較容易理解的例子:

要理解切面編程,就需要先理解什麼是切面。用刀把一個西瓜分成兩瓣,切開的切口就是切面;炒菜,鍋子與爐子共同來完成炒菜,鍋與爐子就是切面。在web層級設計中,web層->網關層->服務層->資料層,每一層之間也是一個切面。程式設計中,物件與物件之間,方法與方法之間,模組與模組之間都是一個個切面。

我們一般做活動的時候,一般對每一個介面都會做活動的有效性校驗(是否開始、是否結束等等)、以及這個介面是不是需要使用者登入。

按照正常的邏輯,我們可以這麼做。

細說Spring——AOP詳解(AOP概覽)

這有個問題就是,有多少接口,就要多少次程式碼copy。對於一個“懶人”,這是不可容忍的。好,提出一個公共方法,每個介面都來呼叫這個介面。這裡有點切面的味道了。

細說Spring——AOP詳解(AOP概覽)同樣有個問題,我雖然不用每次都copy程式碼了,但是,每個介面總得要呼叫這個方法吧。於是就有了切面的概念,我將方法注入到介面呼叫的某個地方(切點)。

細說Spring——AOP詳解(AOP概覽)這樣介面只需要關心特定的業務,而不需要專注於其他非該介面所關注的邏輯或處理。

紅框處,就是面向切面程式設計。

二、AOP中的相關概念

看過了上面的例子,我想大家腦中對AOP已經有了一個大致的雛形,但是又對上面提到的切面之類的術語有一些模糊的地方,接下來就來講解一下AOP中的相關概念,了解了AOP中的概念,才能真正的掌握AOP的精髓。

這裡還是先給一個比較專業的概念定義:

Aspect(切面): Aspect 宣告類似Java 中的類別聲明,在Aspect 中會包含著一些Pointcut 以及相應的Advice。

Joint point(連接點):表示在程式中明確定義的點,典型的包括方法調用,對類別成員的存取以及異常處理程序區塊的執行等等,它本身還可以嵌套其它joint point。

Pointcut(切點):表示一組joint point,這些joint point 或是透過邏輯關係組合起來,或是透過通配、正規表示式等方式集中起來,它定義了對應的Advice 將會是發生的地方。

Advice(增強):Advice 定義了在Pointcut 裡面定義的程式點具體要做的操作,它透過before、after 和around 來區別是在每個joint point 之前、之後還是代替執行的程式碼。

Target(目標物件):織入 Advice 的目標物件.。

Weaving(織入):將Aspect 和其他物件連接起來, 並建立Adviced object 的過程

然後舉出一個容易理解的例子:

看完了上面的理論部分知識, 我相信還是會有不少朋友感覺到AOP 的概念還是很模糊, 對AOP 中的各種概念理解的還不是很透徹. 其實這很正常, 因為AOP 中的概念是在是太多了, 我當時也是花了老大勁才梳理清楚的.

下面我以一個簡單的例子來比喻一下AOP 中Aspect, Joint point, Pointcut 與Advice之間的關係.

讓我們來假設一下, 從前有一個叫爪哇的小縣城, 在一個月黑風高的晚上, 這個縣城中發生了命案. 作案的兇手十分狡猾, 現場沒有留下什麼有價值的線索. 不過萬幸的是, 剛從隔壁回來的老王恰好在這時候無意中發現了兇手行凶的過程, 但是由於天色已晚, 加上兇手蒙著面, 老王並沒有看清兇手的面目, 只知道兇手是個男性, 身高約七尺五寸. 爪哇縣的縣令根據老王的描述, 對守門的士兵下命令說: 凡是發現有身高七尺五寸的男性, 都要抓過來審問. 士兵當然不敢違背縣令的命令, 只好把進出城的所有符合條件的人都抓了起來.

來讓我們看一下上面的一個小故事和AOP 到底有什麼對應關係.

首先我們知道, 在Spring AOP 中Joint point 指代的是所有方法的執行點, 而point cut 是一個描述信息, 它修飾的是Joint point, 透過point cut, 我們就可以確定哪些Joint point 可以被織入Advice. 對應到我們在上面舉的例子, 我們可以做一個簡單的類比, Joint point 就相當於爪哇的小縣城裡的百姓,pointcut 就相當於老王所做的指控, 即兇手是個男性, 身高約七尺五寸, 而Advice 則是施加在符合老王所描述的嫌疑人的動作: 抓過來審問.

為什麼可以這樣類比呢?

#Joint point : 爪哇的小縣城裡的百姓: 因為根據定義, Joint point 是所有可能被織入Advice 的候選的點, 在Spring AOP中, 則可以認為所有方法執行點都是Joint point. 而在我們上面的例子中, 命案發生在小縣城中, 按理說在此縣城中的所有人都有可能是嫌疑人.

Pointcut :男性, 身高約七尺五寸: 我們知道,所有的方法(joint point) 都可以織入Advice, 但是我們並不希望在所有方法上都織入Advice, 而Pointcut 的作用就是提供一組規則來匹配joinpoint, 給滿足規則的joinpoint 添加Advice. 同理, 對於縣令來說, 他再昏庸, 也知道不能把縣城中的所有百姓都抓起來審問, 而是根據兇手是個男性, 身高約七尺五寸, 把符合條件的人抓起來. 在這裡兇手是個男性, 身高約七尺五寸就是一個修飾謂語, 它限定了兇手的範圍, 滿足此修飾規則的百姓都是嫌疑人, 都需要抓起來審問.

Advice :抓過來審問, Advice 是一個動作, 即一段Java 代碼, 這段Java 代碼是作用於point cut 所限定的那些Joint point 上的. 同理, 對比到我們的例子中, 抓過來審問這個動作就是對作用於那些滿足男性, 身高約七尺五寸的爪哇的小縣城裡的百姓.

Aspect::Aspect 是point cut 與Advice 的組合, 因此在這裡我們就可以類比: “根據老王的線索, 凡是發現有身高七尺五寸的男性, 都要抓過來審問」 這一整個動作可以被認為是一個Aspect.

最後是一個描述這些概念之間關係的圖:

細說Spring——AOP詳解(AOP概覽)三、其他的一些內容

AOP中的Joinpoint可以有多種類型:建構方法調用,字段的設定和獲取,方法的調用,方法的執行,異常的處理執行,類別的初始化。也就是說在AOP的概念中我們可以在上面的這些Joinpoint上織入我們自訂的Advice,但是在Spring中卻沒有實現上面所有的joinpoint,確切的說,Spring只支援方法執行類型的Joinpoint。

Advice 的類型

before advice, 在join point 前被執行的advice. 雖然before advice 是在join point 前被執行, 但是它並不能夠阻止join point 的執行, 除非發生了異常(即我們在before advice 代碼中, 不能人為地決定是否繼續執行join point 中的代碼)

after return advice, 在一個join point 正常返回後執行的advice

after throwing advice, 當一個join point 拋出異常後執行的advice

after(final) advice, 無論一個join point 是正常退出還是發生了異常, 都會被執行的advice.

around advice, 在join point 前和joint point 退出後都執行的advice. 這個是最常用的advice.

introduction,introduction可以為原有的對象增加新的屬性和方法。

以上是細說Spring——AOP詳解(AOP概覽)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除