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 }
原文地址:https://www.cnblogs.com/victoria-c/p/5750423.html