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