Spring AOP實例——異常處理和記錄程序執行時間


實例簡介:

  這個實例主要用於在一個系統的所有方法執行過程中出線異常時,把異常信息都記錄下來,另外記錄每個方法的執行時間。

      用兩個業務邏輯來說明上述功能,這兩個業務邏輯首先使用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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM