Spring——AOP是什么-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關Spring——AOP是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都做網(wǎng)站、網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元五臺做網(wǎng)站,已為上家服務,為五臺各地企業(yè)和個人服務,聯(lián)系電話:18982081108

一、對AOP的初印象

首先先給出一段比較專業(yè)的術語(來自百度):

在軟件業(yè),AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一
維護的一種技術。AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利
用AOP可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效
率。

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

要理解切面編程,就需要先理解什么是切面。用刀把一個西瓜分成兩瓣,切開的切口就是切面;炒菜,鍋與爐子共同來完成炒菜,鍋與爐子就是切面。web層級設計中,web層->網(wǎng)關層->服務層->數(shù)據(jù)層,每一層之間也是一個切面。編程中,對象與對象之間,方法與方法之間,模塊與模塊之間都是一個個切面。

我們一般做活動的時候,一般對每一個接口都會做活動的有效性校驗(是否開始、是否結(jié)束等等)、以及這個接口是不是需要用戶登錄。

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

Spring——AOP是什么

這有個問題就是,有多少接口,就要多少次代碼copy。對于一個“懶人”,這是不可容忍的。好,提出一個公共方法,每個接口都來調(diào)用這個接口。這里有點切面的味道了。

Spring——AOP是什么同樣有個問題,我雖然不用每次都copy代碼了,但是,每個接口總得要調(diào)用這個方法吧。于是就有了切面的概念,我將方法注入到接口調(diào)用的某個地方(切點)。

Spring——AOP是什么這樣接口只需要關心具體的業(yè)務,而不需要關注其他非該接口關注的邏輯或處理。

紅框處,就是面向切面編程。

二、AOP中的相關概念

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

這里還是先給出一個比較專業(yè)的概念定義:

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

Joint point(連接點):表示在程序中明確定義的點,典型的包括方法調(diào)用,對類成員的訪問以及異常處理程序塊的執(zhí)行等等,它自身還可以嵌套其它 joint point。

Pointcut(切點):表示一組 joint point,這些 joint point 或是通過邏輯關系組合起來,或是通過通配、正則表達式等方式集中起來,它定義了相應的 Advice 將要發(fā)生的地方。

Advice(增強):Advice 定義了在 Pointcut 里面定義的程序點具體要做的操作,它通過 before、after 和 around 來區(qū)別是在每個 joint point 之前、之后還是代替執(zhí)行的代碼。

Target(目標對象):織入 Advice 的目標對象.。

Weaving(織入):將 Aspect 和其他對象連接起來, 并創(chuàng)建 Adviced object 的過程

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

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

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

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

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

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

為什么可以這樣類比呢?

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

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

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

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

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

Spring——AOP是什么三、其他的一些內(nèi)容

AOP中的Joinpoint可以有多種類型:構(gòu)造方法調(diào)用,字段的設置和獲取,方法的調(diào)用,方法的執(zhí)行,異常的處理執(zhí)行,類的初始化。也就是說在AOP的概念中我們可以在上面的這些Joinpoint上織入我們自定義的Advice,但是在Spring中卻沒有實現(xiàn)上面所有的joinpoint,確切的說,Spring只支持方法執(zhí)行類型的Joinpoint。

Advice 的類型

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

after return advice, 在一個 join point 正常返回后執(zhí)行的 advice

after throwing advice, 當一個 join point 拋出異常后執(zhí)行的 advice

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

around advice, 在 join point 前和 joint point 退出后都執(zhí)行的 advice. 這個是最常用的 advice.

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

感謝各位的閱讀!關于Spring——AOP是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文標題:Spring——AOP是什么-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://bm7419.com/article24/hedje.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、商城網(wǎng)站、企業(yè)建站、網(wǎng)站維護、外貿(mào)建站定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司