日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring5参考指南:基于Schema的AOP

發(fā)布時間:2024/2/28 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring5参考指南:基于Schema的AOP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 基于Schema的AOP
    • 定義Aspect
    • 定義Pointcut
    • 定義Advice
    • advice參數(shù)
    • Advisors

基于Schema的AOP

上篇文章我們講到了使用注解的形式來使用Spring AOP。本文我們介紹如何使用XML Schema的形式使用Spring AOP。

要想使用本文的AOP命名空間標記,需要導入xmlns:aop=“http://www.springframework.org/schema/aop”。

在Spring配置中,所有Aspect和Advisor元素都必須放在aop:config元素中(在應用程序上下文配置中可以有多個aop:config元素)。aop:config元素可以包含pointcut、advisor和aspect元素(請注意,這些元素必須按該順序聲明)。

定義Aspect

一個aspect是定義在Spring應用程序上下文的java bean對象。

你可以使用aop:aspect元素聲明一個方面,并使用ref屬性引用相應的bean,如下示例所示:

<aop:config><aop:aspect id="concurrentOperationRetry" ref="concurrentOperationExecutor"></aop:aspect></aop:config><bean id="concurrentOperationExecutor"class="com.flydean.aspect.ConcurrentOperationExecutor"><property name="maxRetries" value="3"/><property name="order" value="100"/></bean>

定義Pointcut

你可以在aop:config中使用aop:pointcut來定義一個Pointcut,如下所示:

<aop:config><aop:pointcut id="idempotentOperation"expression="execution(* com.flydean.service.*.*(..))and@annotation(com.flydean.beans.Idempotent)"/></aop:config>

定義在頂層aop:config中的aop:pointcut可以在多個aspects和advisors之間共享。

當組合切入點子表達式時,可以使用and、or和not關鍵字來代替&& || 和!,如下所示:

<aop:pointcut id="businessService"expression="execution(* com.xyz.myapp.service.*.*(..)) && this(service)"/> <aop:pointcut id="businessService"expression="execution(* com.xyz.myapp.service.*.*(..)) and this(service)"/>

定義Advice

schema-based AOP 支持使用與@Aspectj樣式相同的五種建議,它們具有完全相同的語義。

Before Advice

在匹配的方法執(zhí)行之前運行通知。它通過在aop:aspect中聲明使用的aop:before元素,如下示例所示:

<aop:beforepointcut-ref="dataAccessOperation"method="doAccessCheck"/>

After Returning Advice

After Returning Advice,在匹配的方法執(zhí)行正常完成時運行。它在一個aop:aspect中聲明,方式與之前的通知相同。下面的示例演示如何聲明它:

<aop:after-returningpointcut-ref="dataAccessOperation"method="doAccessCheck"/>

正如在@Aspectj樣式中一樣,您可以在通知正文中獲得返回值。為此,請使用returning來指定應將返回值傳遞到的參數(shù)的名稱,如下示例所示:

<aop:after-returningpointcut-ref="dataAccessOperation"returning="retVal"method="doAccessCheck"/>

doAccessCheck方法必須要有聲明名為retval的參數(shù)。如下所示:

public void doAccessCheck(Object retVal) {...

After Throwing Advice

當匹配的方法引發(fā)異常退出時執(zhí)行。它通過在aop:aspect中聲明after-throwing 元素來實現(xiàn),如下示例所示:

<aop:after-throwingpointcut-ref="dataAccessOperation"method="doRecoveryActions"/>

同樣的,你可以在通知方法中獲得拋出的異常,如下所示:

<aop:after-throwingpointcut-ref="dataAccessOperation"throwing="dataAccessEx"method="doRecoveryActions"/>

doRecoveryActions方法必須有聲明名為DataAccessEx的參數(shù),如下所示:

public void doRecoveryActions(DataAccessException dataAccessEx) {...

After (Finally) Advice

無論匹配的方法執(zhí)行如何退出,after(finally)通知都會運行。可以使用after元素聲明它,如下示例所示:

<aop:afterpointcut-ref="dataAccessOperation"method="doReleaseLock"/>

Around Advice

最后一種advice是around advice的。around通知運行“around”匹配的方法執(zhí)行。它有機會在方法執(zhí)行之前和之后都進行工作,并確定何時、如何以及該方法真正開始執(zhí)行。

你可以使用aop:around元素來聲明around advice。advice方法的第一個參數(shù)必須是ProceedingJoinPoint類型。

<aop:aroundpointcut-ref="businessService"method="doBasicProfiling"/>

doBasicProfiling advice的實現(xiàn)如下:

public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {// start stopwatchObject retVal = pjp.proceed();// stop stopwatchreturn retVal; }

advice參數(shù)

如果您希望顯式地為advice方法指定參數(shù)名,可以使用advice元素的arg-names屬性來指定參數(shù)名,下面是例子:

<aop:config><aop:aspect ref="profiler"><aop:pointcut id="theExecutionOfSomePersonServiceMethod"expression="execution(* com.flydean.service.PersonService.getPerson(String,int))and args(name, age)"/><aop:around pointcut-ref="theExecutionOfSomePersonServiceMethod"method="profile"/></aop:aspect></aop:config>

相應的aspect bean定義如下:

public class SimpleProfiler {public Object profile(ProceedingJoinPoint call, String name, int age) throws Throwable {StopWatch clock = new StopWatch("Profiling for '" + name + "' and '" + age + "'");try {clock.start(call.toShortString());return call.proceed();} finally {clock.stop();System.out.println(clock.prettyPrint());}} }

profile接收兩個參數(shù)。

Advisors

“Advisors”的概念來自于Spring中定義的AOP支持,在AspectJ中沒有直接的等價物。Advisors就像一個獨立的小方面,只有一條advice。

Spring使用aop:advisor元素支持Advisor概念。您通常會看到它與事務性advice結合使用,后者在Spring中也有自己的名稱空間支持。以下示例展示了advisor:

<aop:config><aop:pointcut id="businessService"expression="execution(* com.xyz.myapp.service.*.*(..))"/><aop:advisorpointcut-ref="businessService"advice-ref="tx-advice"/></aop:config><tx:advice id="tx-advice"><tx:attributes><tx:method name="*" propagation="REQUIRED"/></tx:attributes> </tx:advice>

本文的例子可以參考aop2

更多教程請參考 flydean的博客

總結

以上是生活随笔為你收集整理的Spring5参考指南:基于Schema的AOP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。