呵呵,這兩天項目比較急,事情也比較多,所以沒有及時更新。
上一回簡單介紹了代理機制,通過創(chuàng)建LogBeforeAdvice來實現(xiàn)。通過實現(xiàn)MethodBeforeAdvice接口,會在目標(biāo)對象的方法執(zhí)行之前被呼叫。當(dāng)然也可以通過實現(xiàn)AfterReturningAdvice,使得目標(biāo)對象的方法在執(zhí)行之后被調(diào)用。
同樣創(chuàng)建LogAfterAdvice類,實現(xiàn)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"><!--代理目標(biāo)-->
<ref bean="helloSpeaker"/>
</property>
<property name="interceptorNames"><!--代理實現(xiàn)類-->
<list>
<value>logBeforeAdvice</value>
<value>logAfterAdvice</value>
</list>
</property>
</bean>
</beans>
這樣就實現(xiàn)了目標(biāo)對象的方法在執(zhí)行之后被調(diào)用。
同樣,在方法執(zhí)行前后調(diào)用目標(biāo)對象的方法也可以不通過上面的這種方式(畢竟實現(xiàn)兩個接口比較麻煩),可以直接通過實現(xiàn)MethodInterceptor接口,達到目的。
如LogInterceptor類便實現(xiàn)了這樣的接口,如下
(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"><!--代理目標(biāo)-->
<ref bean="helloSpeaker"/>
</property>
<property name="interceptorNames"><!--代理實現(xiàn)類-->
<list>
<value>logInterceptor</value>
</list>
</property>
</bean>
</beans>
通過實現(xiàn)MethodInterceptor接口,同樣實現(xiàn)了這樣的功能。