1.采用Interception Around通知的形式實現
Interception Around通知會在Join Point的前后執行,實現Interception Around通知的類需要實現接口MethodInterceptor。其實現思路是:
???? 1)首先實現接口MethodInterceptor,在Invoke()方法里編寫負責輸出日志信息的代碼,具體業務邏輯還使用前面的接口TimeBookInterface和它的實現類TimeBook
???? 2)然后在Spring的配置文檔中定義PointCut
???? 3)最后編寫測試程序,執行,查看輸出
?
?? 1)編寫負責輸出日志信息的類LogAround
???
//****LogAround.java**** package com.gc.actionimport org.aopalliance.interceptor.MethodInvocation; import org.aopalliance.interceptor.MethodInterceptor; import org.apache.log4j.Level; import org.apache.log4j.Logger;//Interception Around通知會在Join Point的前后執行 public class LogAround implements MethodIntercetor{private Logger logger = Logger.getLogger(this.getClass().getName());//負責輸出日志信息的代碼public Object invoke(MethodInvocation mi) throw Throwabel{logger.log(Level.INFO,mi.getArguments()[0]+"開始審核數據...");try{Object result = mi.proceed();return result;}finally{logger.log(Level.INFO,mi.getArguments()[0]+"審核數據結束...")} } }
參數MethodInvocation:通過它可以獲得方法的名稱,程序傳入的參數Object[]等
proceed方法,通過它即可執行被調用的方法
return result,返回值為被調用方法的返回值
??? com.gc.impl包中的接口和 com.gc.action包中的類
//*****TimeBookInterface.java****package com.gc.impl; import org.apache.log4j.Level;public interface TimeBookInterface{public void doAuding(String name); }//*****TimeBook.java******* package com.gc.action; import com.gc.impl.TimeBookInterface;public class TimeBook implements TimeBookInterface{public void doAuditing(String name){.... } }
??? 2)定義Spring的配置文檔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="HelloWorld" class = "com.gc.action.HelloWorld" depends-on="date"><property name = "msg"><value>HelloWorld</value></property><property name = "date"><ref bean = "date"/></property></bean><bean id="date" class="java.util.Date"/><bean id="log" class="com.gc.action.LogAround"/><bean id="timeBook" class="com.gc.action.TimeBook"/><bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="proxyInterfaces"><value>com.gc.impl.TimeBookInterface</value></property><property name="target"><ref Bean="timeBook"/></proterty><property name="interceportNames"><list><value>log</value></list></property></bean>
</beans>
?? id為log的Bean,負責輸出日志信息;
?? id為timeBook的Bean,負責具體的業務邏輯考勤審核
?? id為logProxy的Bean,使用Spring提供的ProxyFactoryBean來實現代理,在該Bean里定義相關的屬性,包括要代理的接口,目標類急要使用的Interceptor。
? 3)測試代碼
??
1 //******TestHelloWorld********* 2 3 package com.gc.test; 4 5 import com.gc.action.TimeBook; 6 import com.gc.aciton.TimeBookProxy; 7 import com.gc.impl.TimeBookInterface; 8 public class TestHelloWorld{ 9 public static void main(String[] args){ 10 ApplicationContext actx = new FileSystemXmlApplicationContext("config.xml"); 11 TimeBookInterface timeBookProxy = (TimeBookInterface)actx.getBean("logProxy"); 12 timeBookProxy.doAuditing("張三"); 13 } 14 15 }
?