Spring 框架的一個(gè)關(guān)鍵組件是面向切面的編程(AOP)框架。面向切面的編程需要把程序邏輯分解成不同的部分稱(chēng)為所謂的關(guān)注點(diǎn)。跨一個(gè)應(yīng)用程序的多個(gè)點(diǎn)的功能被稱(chēng)為橫切關(guān)注點(diǎn),這些橫切關(guān)注點(diǎn)在概念上獨(dú)立于應(yīng)用程序的業(yè)務(wù)邏輯。在軟件開(kāi)發(fā)過(guò)程中有各種各樣的很好的切面的例子,如日志記錄、審計(jì)、聲明式事務(wù)、安全性和緩存等。
在 OOP 中,關(guān)鍵單元模塊度是類(lèi),而在 AOP 中單元模塊度是切面。依賴(lài)注入幫助你對(duì)應(yīng)用程序?qū)ο笙嗷ソ怦詈?,AOP 可以幫助你從它們所影響的對(duì)象中對(duì)橫切關(guān)注點(diǎn)解耦。AOP 像是編程語(yǔ)言的觸發(fā)物,如 Perl,.NET,Java 或者其他語(yǔ)言。
Spring AOP 模塊提供攔截器來(lái)攔截一個(gè)應(yīng)用程序,例如,當(dāng)執(zhí)行一個(gè)方法時(shí),你可以在方法執(zhí)行之前或之后添加額外的功能。
在我們開(kāi)始使用 AOP 工作之前,讓我們熟悉一下 AOP 概念和術(shù)語(yǔ)。這些術(shù)語(yǔ)并不特定于 Spring,而是與 AOP 有關(guān)的。
項(xiàng) | 描述 |
---|---|
Aspect | 一個(gè)模塊具有一組提供橫切需求的 APIs。例如,一個(gè)日志模塊為了記錄日志將被 AOP 方面調(diào)用。應(yīng)用程序可以擁有任意數(shù)量的方面,這取決于需求。 |
Join point | 在你的應(yīng)用程序中它代表一個(gè)點(diǎn),你可以在插件 AOP 方面。你也能說(shuō),它是在實(shí)際的應(yīng)用程序中,其中一個(gè)操作將使用 Spring AOP 框架。 |
Advice | 這是實(shí)際行動(dòng)之前或之后執(zhí)行的方法。這是在程序執(zhí)行期間通過(guò) Spring AOP 框架實(shí)際被調(diào)用的代碼。 |
Pointcut | 這是一組一個(gè)或多個(gè)連接點(diǎn),通知應(yīng)該被執(zhí)行。你可以使用表達(dá)式或模式指定切入點(diǎn)正如我們將在 AOP 的例子中看到的。 |
Introduction | 引用允許你添加新方法或?qū)傩缘浆F(xiàn)有的類(lèi)中。 |
Target object | 被一個(gè)或者多個(gè)方面所通知的對(duì)象,這個(gè)對(duì)象永遠(yuǎn)是一個(gè)被代理對(duì)象。也稱(chēng)為被通知對(duì)象。 |
Weaving | Weaving 把方面連接到其它的應(yīng)用程序類(lèi)型或者對(duì)象上,并創(chuàng)建一個(gè)被通知的對(duì)象。這些可以在編譯時(shí),類(lèi)加載時(shí)和運(yùn)行時(shí)完成。 |
Spring 方面可以使用下面提到的五種通知工作:
通知 | 描述 |
---|---|
前置通知 | 在一個(gè)方法執(zhí)行之前,執(zhí)行通知。 |
后置通知 | 在一個(gè)方法執(zhí)行之后,不考慮其結(jié)果,執(zhí)行通知。 |
返回后通知 | 在一個(gè)方法執(zhí)行之后,只有在方法成功完成時(shí),才能執(zhí)行通知。 |
拋出異常后通知 | 在一個(gè)方法執(zhí)行之后,只有在方法退出拋出異常時(shí),才能執(zhí)行通知。 |
環(huán)繞通知 | 在建議方法調(diào)用之前和之后,執(zhí)行通知。 |
Spring 支持 @AspectJ annotation style 的方法和基于模式的方法來(lái)實(shí)現(xiàn)自定義方面。這兩種方法已經(jīng)在下面兩個(gè)子節(jié)進(jìn)行了詳細(xì)解釋。
方法 | 描述 |
---|---|
XML Schema based | 方面是使用常規(guī)類(lèi)以及基于配置的 XML 來(lái)實(shí)現(xiàn)的。 |
@AspectJ based | @AspectJ 引用一種聲明方面的風(fēng)格作為帶有 Java 5 注釋的常規(guī) Java 類(lèi)注釋。 |
更多建議: