Spring Framework中的AOP編程之入門篇
2005-12-26 15:30 作者: Russell Miles 出處: bea 責任編輯:方舟
應(yīng)用方法跟蹤(Method Tracing)方面 可能最基本的方面就是方法跟蹤方面了。這可能是您找得到的最簡單的方面了,因此它是研究新的AOP實現(xiàn)的一個很好的起點。 方法跟蹤方面在一個目標應(yīng)用程序內(nèi)捕獲對所跟蹤的方法的調(diào)用以及方法的返回值,并以某種方式顯示這種信息。在AOP中,通知的before和after類型用于捕獲這些類型的聯(lián)結(jié)點,因為這兩種通知可以在方法調(diào)用聯(lián)結(jié)點之前或之后觸發(fā)。使用Spring框架,方法跟蹤方面的before通知是在TracingBeforeAdvice類中聲明的。
import java.lang.reflect.Method; import org.springframework.aop. MethodBeforeAdvice;
public class TracingBeforeAdvice implements MethodBeforeAdvice { public void before(Method m, Object[] args, Object target) throws Throwable { System.out.println("Hello world! (by " + this.getClass().getName() + ")"); } } |
類似地,after通知可以在TracingAfterAdvice類中聲明。
import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice;
public class TracingAfterAdvice implements AfterReturningAdvice { public void afterReturning(Object object, Method m, Object[] args, Object target) throws Throwable { System.out.println("Hello world! (by " + this.getClass().getName() + ")"); } } |
這兩個類都通過實現(xiàn)Spring框架的適當通知接口而表示了特定的通知。每種類型的通知都指定實現(xiàn)before(..)或afterReturning(..)方法,以便使Spring運行時可以告訴通知適當?shù)穆?lián)結(jié)點會在何時出現(xiàn)。值得注意的是,TracingAfterAdvice實際上是從AfterReturningAdvice擴展而來的,表示只有在聯(lián)結(jié)點在無異常的情況下獲得返回值時才運行通知。 為了將通知與應(yīng)用程序中的適當聯(lián)結(jié)點關(guān)聯(lián)起來,必須對springconfig.xml進行一些修改。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd">
<beans>
<!-- Bean configuration --> <bean id="businesslogicbean" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>IBusinessLogic</value> </property> <property name="target"> <ref local="beanTarget"/> </property> <property name="interceptorNames"> <list> <value>theTracingBeforeAdvisor</value> <value>theTracingAfterAdvisor</value> </list> </property> </bean> <!-- Bean Classes --> <bean id="beanTarget" class="BusinessLogic"/>
<!-- Advisor pointcut definition for before advice --> <bean id="theTracingBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref local="theTracingBeforeAdvice"/> </property> <property name="pattern"> <value>.*</value> </property> </bean>
<!-- Advisor pointcut definition for after advice --> <bean id="theTracingAfterAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref local="theTracingAfterAdvice"/> </property> <property name="pattern"> <value>.*</value> </property> </bean<
<!-- Advice classes --> <bean id="theTracingBeforeAdvice" class="TracingBeforeAdvice"/> <bean id="theTracingAfterAdvice" class="TracingAfterAdvice"/>
</beans> |
theTracingBeforeAdvisor和theTracingAfterAdvisor advisor被添加到前面所聲明的businesslogicbean。每個advisor都可能截獲所有bean所關(guān)聯(lián)到的聯(lián)結(jié)點。Advisor本身就是bean,而它唯一的作用就是將切入點定義與通知bean關(guān)聯(lián)起來。本例中的切入點定義是在靜態(tài)對象層次結(jié)構(gòu)中指定相關(guān)聯(lián)結(jié)點的正則表達式。 因為本例中使用了org.springframework.aop.support.RegexpMethodPointcutAdvisor切入點advisor,切入點邏輯是使用正則表達式指定的。正則表達式用于識別公有接口對IbusinessLogici接口的聯(lián)結(jié)點。下面是一些可以用來指定IBusinessLogic接口上的不同聯(lián)結(jié)點集合的正則表達式例子:
<value>.*</value>:該表達式選擇advisor所關(guān)聯(lián)到的一個或多個bean上的所有聯(lián)結(jié)點。 <value>./IBusinessLogic/.foo</value>:該表達式只選擇IbusinessLogic接口上的foo()方法的聯(lián)結(jié)點。如果是advisor所關(guān)聯(lián)到的bean,則該表達式只選擇IBusinessLogic接口上的聯(lián)結(jié)點。 |
springconfig.xml文件中最后的bean聲明指定實現(xiàn)通知bean的類。 既然已經(jīng)指定了跟蹤方面的正確配置,那么下一次執(zhí)行MainApplication時,這些方面就會在初始化過程中被編織進去,而BusinessLogic bean中的所有方法都將被跟蹤,如圖2所示。
 圖2. 方法跟蹤方面應(yīng)用到BusinessLogic bean之后的順序圖(單擊圖像查看大圖)
|
方法跟蹤方面和例子應(yīng)用程序的源代碼可在本文末尾的參考資料小節(jié)進行 下載。
|