javascript
Spring5参考指南:基于Schema的AOP
文章目錄
- 基于Schema的AOP
- 定義Aspect
- 定義Pointcut
- 定義Advice
- advice參數
- 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
在匹配的方法執行之前運行通知。它通過在aop:aspect中聲明使用的aop:before元素,如下示例所示:
<aop:beforepointcut-ref="dataAccessOperation"method="doAccessCheck"/>After Returning Advice
After Returning Advice,在匹配的方法執行正常完成時運行。它在一個aop:aspect中聲明,方式與之前的通知相同。下面的示例演示如何聲明它:
<aop:after-returningpointcut-ref="dataAccessOperation"method="doAccessCheck"/>正如在@Aspectj樣式中一樣,您可以在通知正文中獲得返回值。為此,請使用returning來指定應將返回值傳遞到的參數的名稱,如下示例所示:
<aop:after-returningpointcut-ref="dataAccessOperation"returning="retVal"method="doAccessCheck"/>doAccessCheck方法必須要有聲明名為retval的參數。如下所示:
public void doAccessCheck(Object retVal) {...After Throwing Advice
當匹配的方法引發異常退出時執行。它通過在aop:aspect中聲明after-throwing 元素來實現,如下示例所示:
<aop:after-throwingpointcut-ref="dataAccessOperation"method="doRecoveryActions"/>同樣的,你可以在通知方法中獲得拋出的異常,如下所示:
<aop:after-throwingpointcut-ref="dataAccessOperation"throwing="dataAccessEx"method="doRecoveryActions"/>doRecoveryActions方法必須有聲明名為DataAccessEx的參數,如下所示:
public void doRecoveryActions(DataAccessException dataAccessEx) {...After (Finally) Advice
無論匹配的方法執行如何退出,after(finally)通知都會運行。可以使用after元素聲明它,如下示例所示:
<aop:afterpointcut-ref="dataAccessOperation"method="doReleaseLock"/>Around Advice
最后一種advice是around advice的。around通知運行“around”匹配的方法執行。它有機會在方法執行之前和之后都進行工作,并確定何時、如何以及該方法真正開始執行。
你可以使用aop:around元素來聲明around advice。advice方法的第一個參數必須是ProceedingJoinPoint類型。
<aop:aroundpointcut-ref="businessService"method="doBasicProfiling"/>doBasicProfiling advice的實現如下:
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {// start stopwatchObject retVal = pjp.proceed();// stop stopwatchreturn retVal; }advice參數
如果您希望顯式地為advice方法指定參數名,可以使用advice元素的arg-names屬性來指定參數名,下面是例子:
<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接收兩個參數。
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring5参考指南:SpringAO
- 下一篇: Spring5参考指南:AOP代理