zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    IE8中li添加float属性,中英数字混合BUG
    jQuery ajax get与post后台交互中的奥秘
    BZOJ 4816 数字表格
    BZOJ 1598 牛跑步
    BZOJ 4077 Messenger
    相关分析 BZOJ 4821
    Crash的数字表格 BZOJ 2154 / jzptab BZOJ 2693
    回文串 BZOJ 3676
    古代猪文 BZOJ 1951
    树上的路径 BZOJ 3784
  • 原文地址:https://www.cnblogs.com/victoria-c/p/5750423.html
Copyright © 2011-2022 走看看