呵呵,这两天项目比较急,事情也比较多,所以没有及时更新。
上一回简单介绍了代理机制,通过创建LogBeforeAdvice来实现。通过实现MethodBeforeAdvice接口,会在目标对象的方法执行之前被呼叫。当然也可以通过实现AfterReturningAdvice,使得目标对象的方法在执行之后被调用。
同样创建LogAfterAdvice类,实现AfterReturningAdvice接口。
lib包下载:http://www.ziddu.com/download/3555992/SpringAndaop.rar.html
(1)LogAfterAdvice.java
package com.proxy;
import java.lang.reflect.*;
import java.util.logging.Logger;
import java.util.logging.Level;
import org.springframework.aop.AfterReturningAdvice;
public class LogAfterAdvice implements AfterReturningAdvice{
private Logger logger=Logger.getLogger(this.getClass().getName());
public void afterReturning(Object object,Method method,Object[] args,Object target) throws Throwable
{
logger.log(Level.INFO,"LogAfterAdvice mehtod ends "+method);
}
}
(2)advice-config.xml修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="logBeforeAdvice" class="com.proxy.LogBeforeAdvice" />
<bean id="logAfterAdvice" class="com.proxy.LogAfterAdvice" />
<bean id="helloSpeaker" class="com.proxy.HelloSpeaker" />
<bean id="helloProxy"
class="org.springframework.aop.framework.ProxyFactoryBean"><!--建立代理对象-->
<property name="proxyInterfaces"><!--代理接口-->
<value>com.proxy.IHello</value>
</property>
<property name="target"><!--代理目标-->
<ref bean="helloSpeaker"/>
</property>
<property name="interceptorNames"><!--代理实现类-->
<list>
<value>logBeforeAdvice</value>
<value>logAfterAdvice</value>
</list>
</property>
</bean>
</beans>
这样就实现了目标对象的方法在执行之后被调用。
同样,在方法执行前后调用目标对象的方法也可以不通过上面的这种方式(毕竟实现两个接口比较麻烦),可以直接通过实现MethodInterceptor接口,达到目的。
如LogInterceptor类便实现了这样的接口,如下
(3)LogInterceptor.java
package com.proxy;
import java.util.logging.Logger;
import java.util.logging.Level;
import org.aopalliance.intercept.*;
public class LogInterceptor implements MethodInterceptor{
private Logger logger=Logger.getLogger(this.getClass().getName());
public Object invoke(MethodInvocation Invocation) throws Throwable {
logger.log(Level.INFO,"LogInterceptor method starts..."+Invocation.getMethod());
Object result=null;
try
{
result=Invocation.proceed();
}
finally
{
logger.log(Level.INFO,"LogInterceptor method ends..."+Invocation.getMethod());
}
return result;
}
}
(4)advice-config.xml 配置文件修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="logInterceptor" class="com.proxy.LogInterceptor" />
<bean id="helloSpeaker" class="com.proxy.HelloSpeaker" />
<bean id="helloProxy"
class="org.springframework.aop.framework.ProxyFactoryBean"><!--建立代理对象-->
<property name="proxyInterfaces"><!--代理接口-->
<value>com.proxy.IHello</value>
</property>
<property name="target"><!--代理目标-->
<ref bean="helloSpeaker"/>
</property>
<property name="interceptorNames"><!--代理实现类-->
<list>
<value>logInterceptor</value>
</list>
</property>
</bean>
</beans>
通过实现MethodInterceptor接口,同样实现了这样的功能。