我們使用一個簡單的例子來演示一下Spring中的AOP,這是一個log的例子,實際上log是一個對於AOP來說很不好的例子,這裏我們只爲說明Spring AOP的使用。
1.首先我們來創建一個自己的interceptor
這個類必須繼承org.aopalliance.intercept. MethodInterceptor接口。Spring的AOP框架就是參照aopalliance這個標準實現的,所以我們的MyInterceptor要繼承這個標準中的接口。
這個接口只有一個要求實現的方法:
public Object invoke(MethodInvocation methodInvocation) throws Throwable;
下面是我們的MyIntercptor:
public class MyInterceptor implements MethodInterceptor {
private final Log logger = LogFactory.getLog(getClass());
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
logger.info("Beginning method (1): " +
methodInvocation.getMethod().getDeclaringClass() + "." +
methodInvocation.getMethod().getName() + "()");
long startTime = System.currentTimeMillis();
try{
Object result = methodInvocation.proceed();
return result;
}finally{
logger.info("Ending method (1): " +
methodInvocation.getMethod().getDeclaringClass() + "." +
methodInvocation.getMethod().getName() + "()");
logger.info("Method invocation time (1): " +
(System.currentTimeMillis() - startTime) + " ms.");
}
}
}
對於上面的代碼需要說明的是下面兩行代碼:
Object result = methodInvocation.proceed();
return result;
整個程序的流程是這樣的:
1,先是執行在Object result = methodInvocation.proceed();前面的代碼;
2,接着執行Object result = methodInvocation.proceed();,它把執行控制權交給了interceptor stack(攔截器棧)內的下一個interceptor,如果沒有了就交給真正的業務方法;
3,然後執行return result;之前的代碼;
4,最後執行return result;,它把控制權交回它之上的interceptor,如果沒有了就退出interceptor stack。
2.寫出我們的業務對象及其接口
爲了方便我們的業務接口只有一個hello方法:
public interface BusinessInterface {
public void hello();
}
業務對象的代碼如下:
public class BusinessInterfaceImpl implements BusinessInterface{
public void hello() {
System.out.println("hello Spring AOP.");
}
}
3.接下來,我們來看看如何使用我們的寫的interceptor
我們把業務對象作爲AOP的target:
<bean id="businessTarget" class="com.rst.spring.testaop.BusinessInterfaceImpl"/>
接着在bean定義中聲明interceptor:
<bean id="myInterceptor" class="com.rst.spring.testaop.MyInterceptor"/>
最後,我們來聲明真正的業務對象,通過使用它的接口以及Spring的ProxyFactoryBean:
<bean id="businessBean"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.rst.spring.testaop.BusinessInterface</value>
</property>
<property name="interceptorNames">
<list>
<value>myInterceptor</value>
<value>businessTarget</value>
</list>
</property>
</bean>
這裏需要說明兩點:
proxyInterfaces:就是我們的業務對象的實際接口;
interceptorNames:定義了所有interceptors的執行順序,其中業務對象的target作爲list的最後一個。記着一定要把業務對象的target放到list中,否則你的業務對象就不會工作。
4.最後,寫我們的測試類
ClassPathResource resource =
new ClassPathResource("com/rst/spring/testaop/aop_bean.xml");
XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
BusinessInterface businessBean =
(BusinessInterface) beanFactory.getBean("businessBean");
businessBean.hello();
一切正常就可以在log上看到相應的信息了。
以下是附件源代碼的執行效果:
2004-09-08 16:04:51,210 INFO - Beginning method (1): interface com.rst.spring.testaop.BusinessInterface.hello()
2004-09-08 16:04:51,210 INFO - Beginning method (2): interface com.rst.spring.testaop.BusinessInterface.hello()
hello Spring AOP.
2004-09-08 16:04:51,210 INFO - Ending method (2): interface com.rst.spring.testaop.BusinessInterface.hello()
2004-09-08 16:04:51,210 INFO - Ending method (1): interface com.rst.spring.testaop.BusinessInterface.hello()
2004-09-08 16:04:51,210 INFO - Method invocation time (1): 0 ms.
源代碼需要spring.jar, aopallience.jar, commons-logging.jar。
Spring中的AOP log例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.