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.action import 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 }