我們使用一個簡單的例子來演示一下Spring中的AOP
這是一個log的例子
實際上log是一個對於AOP來說很不好的例子
這裡我們只為說明Spring AOP的使用
首先我們來創建一個自己的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 {
(
Beginning method (
):
+
methodInvocation
getMethod()
getDeclaringClass() +
+
methodInvocation
getMethod()
getName() +
()
);
long startTime = System
currentTimeMillis();
try{
Object result = methodInvocation
proceed();
return result;
}finally{
(
Ending method (
):
+
methodInvocation
getMethod()
getDeclaringClass() +
+
methodInvocation
getMethod()
getName() +
()
);
(
Method invocation time (
):
+
(System
currentTimeMillis()
startTime) +
ms
);
}
}
}
對於上面的代碼需要說明的是下面兩行代碼
Object result = methodInvocation
proceed();
return result;
整個程序的流程是這樣的
先是執行在Object result = methodInvocation
proceed();前面的代碼
接著執行Object result = methodInvocation
proceed();
它把執行控制權交給了interceptor stack(攔截器棧)內的下一個interceptor
如果沒有了就交給真正的業務方法
然後執行return result;之前的代碼
最後執行return result;
它把控制權交回它之上的interceptor
如果沒有了就退出interceptor stack
寫出我們的業務對象及其接口 為了方便我們的業務接口只有一個hello方法
public interface BusinessInterface {
public void hello();
}
業務對象的代碼如下
public class BusinessInterfaceImpl implements BusinessInterface{
public void hello() {
System
out
println(
hello Spring AOP
);
}
}
接下來我們來看看如何使用我們的寫的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中
否則你的業務對象就不會工作
最後寫我們的測試類 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上看到相應的信息了
以下是附件源代碼的執行效果
:
:
INFO
Beginning method (
): interface com
rst
spring
testaop
BusinessInterface
hello()
:
:
INFO
Beginning method (
): interface com
rst
spring
testaop
BusinessInterface
hello()
hello Spring AOP
:
:
INFO
Ending method (
): interface com
rst
spring
testaop
BusinessInterface
hello()
:
:
INFO
Ending method (
): interface com
rst
spring
testaop
BusinessInterface
hello()
:
:
INFO
Method invocation time (
):
ms
源代碼需要spring
jar
aopallience
jar
commons
logging
jar
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28872.html