實例簡介:
這個實例主要用於在一個系統的所有方法執行過程中出線異常時,把異常信息都記錄下來,另外記錄每個方法的執行時間。
用兩個業務邏輯來說明上述功能,這兩個業務邏輯首先使用Spring AOP的自動代理功能,然后一個用Java的動態代理,一個用CGLIB代理。
實現思路:
首先定義負責異常處理的Advice:ExceptionHandler.java,定義記錄程序執行時間的Advice:TimeHandler.java
然后定義業務邏輯接口LogicInterface.java,編寫實現業務邏輯接口的類Logic1.java,該業務邏輯在Spring AOP中使用java的動態代理
編寫另一個業務邏輯Logic2.java,不實現業務邏輯接口,該業務邏輯在Spring AOP中使用CGLIB代理,然后使用自動代理定義配置文件config.xml
最后編寫測試程序,執行並查看輸出結果。
1.定義異常處理的Adice:ExceptionHandle.java
1 //***ExceptionHandler.java******** 2 package com.gc.action; 3 4 import java.lang.reflect.Method; 5 6 import org.apache.log4j.Level; 7 import org.apache.log4j.Logger; 8 import org.springframework.aop.ThrowsAdvice; 9 10 //使用Throw通知類型來實現Advice 11 public class ExceptionHandler implements ThrowAdvice{ 12 private Logger logger = Logger.getLogger(this.getClass().getName()); 13 14 public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass)throws Throwable{ 15 logger.log(Level.INFO,args[0]+" 執行 "+method.getName()+"時有異常拋出..."+subclass); 16 17 } 18 19 }
2.定義記錄程序執行時間的Advice為TimeHandler.java
1 //***TimeHandler.java***** 2 package com.gc.action; 3 4 import org.aopalliance.interceptor.MethodInterceptor; 5 import org.aopalliance.interceptor.MethodInvocation; 6 import org.apache.log4j.Level; 7 import org.apache.log4j.Logger; 8 9 public class TimeHandler implements MethodInterceptor{ 10 private Logger logger = Logger.getLogger(this.getClass().getName()); 11 12 public Object invoke(MethodInvocation methodInvocation)throws Throwable{ 13 long procTime = System.currentTimeMillis(); 14 logger.log(Level.INFO,methodInvocation.getArguments()[0]+"開始執行"+methodInvocation.getMethod()+"方法"); 15 } 16 try{ 17 Object result = methodInvocation.proceed(); 18 return result; 19 20 } 21 finally{ 22 procTime = System.currentTimeMillis()-procTime; 23 logger.log(Level.INFO,methodInvocation.getArguments()[0]+"執行"+methodInvocation.getMethod()+"方法結束"); 24 logger.log(Level.INFO,"執行"+methodInvocation.getMethod.getName()+"方法共用了"+procTime+"毫秒"); 25 } 26 }
3.定義業務邏輯接口
1 //*****LogicInterface.java***** 2 package com.gc.impl; 3 4 public interface LogicInterface{ 5 public void doInsert(String name); 6 public void doUpdate(String name); 7 public void doDelete(String name); 8 9 }
4.編寫實現業務邏輯接口的類Logic1.java
1 //*****Logic2.java****** 2 package com.gc.action; 3 4 import com.gc.impl.LogicInterface; 5 6 public class Logic1 implements LogicInterface{ 7 public void doInsert(String name) 8 { 9 System.out.println("新增..."); 10 for(int i=0;i<1000000;i++) 11 { 12 //模擬執行時間 13 } 14 } 15 public void doUpdate(String name) 16 { 17 System.out.println("修改..."); 18 for(int i=0;i<3000000;i++) 19 { 20 //模擬執行時間 21 } 22 } 23 public void doDelete(String name) 24 { 25 System.out.println("刪除..."); 26 for(int i=0;i<2000000;i++) 27 { 28 //模擬執行時間 29 } 30 } 31 32 }
5.編寫不實現業務邏輯接口的類Logic2.java
1 1 //*****Logic2.java****** 2 2 package com.gc.action; 3 3 4 4 import com.gc.impl.LogicInterface; 5 5 6 6 public class Logic2{ 7 7 public void doInsert(String name) 8 8 { 9 9 System.out.println("新增..."); 10 10 for(int i=0;i<4000000;i++) 11 11 { 12 12 //模擬執行時間 13 13 } 14 14 } 15 15 public void doUpdate(String name) 16 16 { 17 17 System.out.println("修改..."); 18 18 for(int i=0;i<5000000;i++) 19 19 { 20 20 //模擬執行時間 21 21 } 22 22 } 23 23 public void doDelete(String name) 24 24 { 25 25 System.out.println("刪除..."); 26 26 for(int i=0;i<6000000;i++) 27 27 { 28 28 //模擬執行時間 29 29 } 30 30 } 31 31 32 32 }
6.使用自動代理定義配置文件config.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 4 "http://www.springframework.org/dtd/spring-beans.dtd"> 5 6 <beans> 7 <bean id="logic1" class="com.gc.action.Logic1"/> 8 <bean id="logic2" class="com.gc.action.Logic2"/> 9 <!--設定自動代理--> 10 <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 11 <!--負責記錄有異常發生時的信息--> 12 <bean id="exceptionHandler" class="com.gc.action.ExceptionHandler"/> 13 <bean id="exceptionHandlerAdvisor" class="org.springframework.support.RegexpMethodPointcutAdvisor"> <property name="advice"> 14 <ref bean="exceptionhandler"/> 15 </property> 16 <property name="patterns"> 17 <value>.*.*</value> 18 </property> 19 </bean> 20 <!--負責記錄方法的記錄時間--> 21 <bean id="timeHandler" class="com.gc.action.TimeHandler"/> 22 <bean id="timeHandlerAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 23 <property name="advice"> 24 <ref bean="timeHandler"/> 25 </property> 26 <property name="patterns"> 27 <value>.*.*</value> 28 </property> 29 </bean> 30 </beans>
7.測試程序
1 //***TestLogic1**** 2 package com.gc.test; 3 4 import org.springframework.context.ApplicationContext; 5 import org.srpingframework.context.support.FileSystemXmlApplicationContext; 6 7 import com.gc.impl.LogicInterface; 8 9 public class TestLogic1{ 10 public static void main(String[] args)throw InstantiationExcetion,IIIegalAccessException,ClassNotFoundException{ 11 ApplicationContext actx = new FileSystemXmlApplicationContext("exception_config.xml"); 12 LogicInterface logic=(LogicInterface)actx.getBean("logic1"); 13 try{ 14 logic.doInsert("張"); 15 logic.doUpdate("王"); 16 logic.doDelete("李"); 17 } 18 catch(Exception e) 19 { 20 } 21 } 22 }