在軟體業,aop為aspect oriented programming的縮寫,意為:面向切面程式設計,通過預編譯方
式和執行期動態**實現程式功能的統一維護的一種技術。aop是oop的延續,是軟體開發中的乙個
熱點,也是spring框架中的乙個重要內容,是函式式程式設計的一種衍生范型。利用aop可以對業務邏輯
的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高
了開發的效率。
然後我們舉乙個比較容易理解的例子(來自:spring 之 aop):
要理解切面程式設計,就需要先理解什麼是切面。用刀把乙個西瓜分成兩瓣,切開的切口就是切面;炒菜,鍋與爐子共同來完成炒菜,鍋與爐子就是切面。web層級設計中,web層->閘道器層->服務層->資料層,每一層之間也是乙個切面。程式設計中,物件與物件之間,方法與方法之間,模組與模組之間都是乙個個切面。
我們一般做活動的時候,一般對每乙個介面都會做活動的有效性校驗(是否開始、是否結束等等)、以及這個介面是不是需要使用者登入。
按照正常的邏輯,我們可以這麼做。
這有個問題就是,有多少介面,就要多少次**copy。對於乙個「懶人」,這是不可容忍的。好,提出乙個公共方法,每個介面都來呼叫這個介面。這裡有點切面的味道了。
同樣有個問題,我雖然不用每次都copy**了,但是,每個介面總得要呼叫這個方法吧。於是就有了切面的概念,我將方法注入到介面呼叫的某個地方(切點)。
這樣介面只需要關心具體的業務,而不需要關注其他非該介面關注的邏輯或處理。
紅框處,就是面向切面程式設計。
看過了上面的例子,我想大家腦中對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的初印象 在軟體業,aop為aspect oriented programming的縮寫,意為 面向切面程式設計,通過預編譯方 式和執行期動態 實現程式功能的統一維護的一種技術。aop是oop的延續,是軟體開發中的乙個 熱點,也是spring框架中的乙個重要內容,是函式式程式設計的一種衍...
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...