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

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

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

一、對(duì)AOP的初印象

首先先給出一段比較專業(yè)的術(shù)語(yǔ)(來(lái)自百度):

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

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

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

我們一般做活動(dòng)的時(shí)候,一般對(duì)每一個(gè)接口都會(huì)做活動(dòng)的有效性校驗(yàn)(是否開始、是否結(jié)束等等)、以及這個(gè)接口是不是需要用戶登錄。

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

Spring——AOP是什么

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

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

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

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

二、AOP中的相關(guān)概念

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

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

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

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

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

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

Target(目標(biāo)對(duì)象):織入 Advice 的目標(biāo)對(duì)象.。

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

然后舉一個(gè)容易理解的例子:

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

下面我以一個(gè)簡(jiǎn)單的例子來(lái)比喻一下 AOP 中 Aspect, Joint point, Pointcut 與 Advice之間的關(guān)系.

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

來(lái)讓我們看一下上面的一個(gè)小故事和 AOP 到底有什么對(duì)應(yīng)關(guān)系.

首先我們知道, 在 Spring AOP 中 Joint point 指代的是所有方法的執(zhí)行點(diǎn), 而 point cut 是一個(gè)描述信息, 它修飾的是 Joint point, 通過(guò) point cut, 我們就可以確定哪些 Joint point 可以被織入 Advice. 對(duì)應(yīng)到我們?cè)谏厦媾e的例子, 我們可以做一個(gè)簡(jiǎn)單的類比, Joint point 就相當(dāng)于 爪哇的小縣城里的百姓,pointcut 就相當(dāng)于 老王所做的指控, 即兇手是個(gè)男性, 身高約七尺五寸, 而 Advice 則是施加在符合老王所描述的嫌疑人的動(dòng)作: 抓過(guò)來(lái)審問(wèn).

為什么可以這樣類比呢?

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

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

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

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

最后是一個(gè)描述這些概念之間關(guān)系的圖:

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

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

Advice 的類型

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

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

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

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

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

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

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

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

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

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

廣告

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

成都網(wǎng)頁(yè)設(shè)計(jì)公司