同样创建LogAfterAdvice类,实现AfterReturningAdvice接口。
(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接口,同样实现了这样的功能。