Spring AOP(面向切面)
1. 前言
大家好,本小節(jié)重點(diǎn)介紹一個(gè)新知識(shí) —— AOP 。作為入門的第一小節(jié),我們需要理解 AOP 的概念,了解 AOP 的專業(yè)術(shù)語(yǔ),明白它的作用。
那么,到底什么是 AOP ,它存在的意義是什么,在開(kāi)發(fā)中扮演了一個(gè)什么樣的角色呢?
隨著疑問(wèn),開(kāi)始本小節(jié)的內(nèi)容。
2. 概述
2.1 AOP 的概念
AOP 并不是 Spring 框架的專屬名稱,它的全稱是 Aspect Oriented Programming ,意為:面向切面編程。
它是 OOP 的一個(gè)延續(xù),通過(guò)預(yù)編譯的方式和運(yùn)行期間動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
名詞解釋:
面向切面編程:
? 其實(shí)切面是數(shù)學(xué)中的一個(gè)概念,表示只有一個(gè)點(diǎn)接觸到球體的一個(gè)平面稱呼為切面,而接觸點(diǎn)稱呼為切點(diǎn)。那么在 Spring 中,切面編程指的是什么呢?
就是在程序運(yùn)行某個(gè)方法的時(shí)候,不修改原始執(zhí)行代碼邏輯,由程序動(dòng)態(tài)地執(zhí)行某些額外的功能,對(duì)原有的方法做增強(qiáng),這就叫做面向切面編程。
那個(gè)被監(jiān)測(cè)的執(zhí)行方法,稱之為切入點(diǎn)。
2.2 AOP 的意義
我們明白了 AOP 的概念,它是一種編程設(shè)計(jì)模式,是一種編程技術(shù),那么為什么在程序中使用它呢?
- Spring 框架的中心宗旨之一是非侵入性,使用 AOP 可以很方便地在某些場(chǎng)景實(shí)現(xiàn)特定的功能,通過(guò)修改配置即可以實(shí)現(xiàn)增加或者去除某些附加功能;
- AOP 設(shè)計(jì)的功能代碼可以復(fù)用,代碼耦合性更低,代碼更加整潔;
- 使用 Spring 提供的 AOP ,讓我們更加注重業(yè)務(wù)代碼實(shí)現(xiàn)本身,而無(wú)需關(guān)注底層設(shè)計(jì)模式與實(shí)現(xiàn)方式。
3. 術(shù)語(yǔ)解釋
3.1 Join point(連接點(diǎn))
所謂連接點(diǎn)是指那些被攔截到的點(diǎn)。在 Spring 中這些點(diǎn)指的是方法,可以看作正在訪問(wèn)的,或者等待訪問(wèn)的那些需要被增強(qiáng)功能的方法。Spring 只支持方法類型的連接點(diǎn)。
3.2 Pointcut(切入點(diǎn))
所謂切入點(diǎn)是一個(gè)規(guī)則,定義了我們要對(duì)哪些 Joinpoint 進(jìn)行攔截。因?yàn)樵谝粋€(gè)程序中會(huì)存在很多的類,每個(gè)類又存在很多的方法,而哪些方法會(huì)應(yīng)用 AOP 對(duì)該方法做功能增強(qiáng)呢?
這就需要依據(jù)我們配置的切入點(diǎn)規(guī)則。
3.3 Advice(通知)
所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知。 也就是對(duì)方法做的增強(qiáng)功能。
通知分類:
- 前置通知:在連接點(diǎn)之前運(yùn)行的通知類型,它不會(huì)阻止流程進(jìn)行到連接點(diǎn),只是在到達(dá)連接點(diǎn)之前運(yùn)行該通知內(nèi)的行為,當(dāng)然 -—— 除非它引發(fā)異常;
- 后置通知:在連接點(diǎn)正常完成后要運(yùn)行的通知,正常的連接點(diǎn)邏輯執(zhí)行完,會(huì)運(yùn)行該通知,當(dāng)然 —— 方法正常返回而沒(méi)有引發(fā)異常;
- 最終通知:無(wú)論連接點(diǎn)執(zhí)行后的結(jié)果如何,正常還是異常,都會(huì)執(zhí)行的通知;
- 異常通知:如果連接點(diǎn)執(zhí)行因拋出異常而退出,則執(zhí)行此通知;
- 環(huán)繞通知:環(huán)繞通知可以在方法調(diào)用之前和之后執(zhí)行自定義行為。
3.4 Target (目標(biāo))
Target 指的是代理的目標(biāo)對(duì)象,更通俗的解釋就是:AOP 對(duì)連接點(diǎn)方法做增強(qiáng),底層是代理模式生成連接點(diǎn)所在類的代理對(duì)象,那么連接點(diǎn)所在的類,就是被代理的類稱呼為 Target。
3.5 Aspect(切面)
切面本質(zhì)是一個(gè)類,只不過(guò)是個(gè)功能類,作為整合 AOP 的切入點(diǎn)和通知。一般來(lái)講,需要在 Spring 的配置文件中配置,或者通過(guò)注解來(lái)配置。
3.6 Weaving(織入)
織入是一種動(dòng)作的描述,在程序運(yùn)行時(shí)將增強(qiáng)的功能代碼也就是通知,根據(jù)通知的類型(前綴后綴等…)放到對(duì)應(yīng)的位置,生成代理對(duì)象。
3.7 Proxy(代理)
一個(gè)類被 AOP 織入增強(qiáng)后,產(chǎn)生的結(jié)果就是代理類
4. 小結(jié)
本小節(jié)主要是 AOP 的入門介紹,那么重點(diǎn)給大家講述了 AOP 的概念、意義、以及常見(jiàn)術(shù)語(yǔ)。
當(dāng)然對(duì)于初學(xué)者而言,文字描述略顯蒼白和枯燥,而我們本小節(jié)目的也是給大家做個(gè)鋪墊,
對(duì)一些名詞做個(gè)解釋和介紹,以便后續(xù)測(cè)試案例的講解。