技术开发 频道

Spring学习笔记 2007-10-31

【IT168技术文档】上一回简单介绍了代理机制,通过创建LogBeforeAdvice来实现。通过实现MethodBeforeAdvice接口,会在目标对象的方法执行之前被呼叫。当然也可以通过实现AfterReturningAdvice,使得目标对象的方法在执行之后被调用。
同样创建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接口,同样实现了这样的功能。

原文地址

0
相关文章