細說Spring AOP詳解(AOP概覽)

2021-09-24 21:31:10 字數 2811 閱讀 3476

一、對aop的初印象

在軟體業,aop為aspect oriented programming的縮寫,意為:面向切面程式設計,通過預編譯方

式和執行期動態**實現程式功能的統一維護的一種技術。aop是oop的延續,是軟體開發中的乙個

熱點,也是spring框架中的乙個重要內容,是函式式程式設計的一種衍生范型。利用aop可以對業務邏輯

的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高

了開發的效率。

然後我們舉乙個比較容易理解的例子(來自:spring 之 aop):

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

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

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

這有個問題就是,有多少介面,就要多少次**copy。對於乙個「懶人」,這是不可容忍的。好,提出乙個公共方法,每個介面都來呼叫這個介面。這裡有點切面的味道了。 

同樣有個問題,我雖然不用每次都copy**了,但是,每個介面總得要呼叫這個方法吧。於是就有了切面的概念,我將方法注入到介面呼叫的某個地方(切點)。

這樣介面只需要關心具體的業務,而不需要關注其他非該介面關注的邏輯或處理。 

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

二、aop中的相關概念

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

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

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

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

下面我以乙個簡單的例子來比喻一下 aop 中aspect,joint point,pointcutadvice之間的關係. 

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

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

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

為什麼可以這樣模擬呢?

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

三、其他的一些內容

aop中的joinpoint可以有多種型別:構造方法呼叫,欄位的設定和獲取,方法的呼叫,方法的執行,異常的處理執行,類的初始化。也就是說在aop的概念中我們可以在上面的這些joinpoint上織入我們自定義的advice,但是在spring中卻沒有實現上面所有的joinpoint,確切的說,spring只支援方法執行型別的joinpoint

advice 的型別

spring中,通過動態**和動態位元組碼技術實現了aop,這些內容,我們將在以後進行講解。

文章參考

細說Spring AOP詳解(AOP概覽)

在軟體業,aop為aspect oriented programming的縮寫,意為 面向切面程式設計,通過預編譯方 式和執行期動態 實現程式功能的統一維護的一種技術。aop是oop的延續,是軟體開發中的乙個 熱點,也是spring框架中的乙個重要內容,是函式式程式設計的一種衍生范型。利用aop可以...

Spring AOP 切點語法詳解

spring借助aspectj的切點表示式語言來定義的切點 aspectj指示器 描述arg 限制連線點匹配引數為指定型別的執行方法 args 限制連線點匹配引數由指定註解標註的執行方法 execution 用於匹配是連線點的執行方法 this 限制連線點匹配aop 的bean引用為指定型別的類 t...

Spring AOP 原始碼詳解

spring aop 是 spring 核心功能之一,日常的工作少不了和 aop 打交道 是時候有必要去了解 spring 對 aop 的封裝和其背後的原理,這樣子我們才能寫出更加高質量的 及產生 bug 的原因 什麼是 aop aop 的相關一些概念 spring aop 的使用方式 spring...