论坛首页 Java企业应用论坛

spring AOP 2.0 实现拦截异常和一些临时功能

浏览 4589 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-26  

          本来是测试网上的例子,看着看着,觉得可以修改的简单一点,说干就干。

1,在Eclispe里面建立一个项目,随便,这叫context吧,使用jdk5的环境。

2,在项目里面加入log4j-1.2.8.jar,commons-logging-1.0.4.jar,cglib-nodep-2.1_3.jar,spring.jar(2.5),aspectweaver.jar,aspecjrt.jar。

3,为了能够在系统中使用log4j,在项目目录下加入log4j.properties,内容

 

  1. log4j.rootLogger=INFO,stdout   
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender   
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   
  4. log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n   
  5.   

4,加入spring的配置文件exception_config.xml

开始的内容:

<!---->

<beans xmlns="http://www.springframework.org/schema/beans"></beans>      

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"        
  4.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          
  5.        xmlns:aop="http://www.springframework.org/schema/aop"          
  6.        xsi:schemaLocation=        
  7.        "http://www.springframework.org/schema/beans         
  8.        http://www.springframework.org/schema/beans/spring-beans.xsd         
  9.        http://www.springframework.org/schema/aop            
  10.        http://www.springframework.org/schema/aop/spring-aop.xsd">  
  11.     </beans>  

   

5,做一个程序接口

java 代码

 

  1. public interface LogicInterface {   
  2.   /**  
  3.   *   
  4.   * @param name  
  5.   */  
  6.  void doInsert(String name);   
  7.      /**  
  8.      *   
  9.      * @param name  
  10.      */  
  11.     void doUpdate(String name);   
  12.      /**  
  13.      *   
  14.      * @param name  
  15.      */  
  16.     void doDelete(String name);   
  17.   
  18. }   
  19.   

6,做两个接口的实现

java 代码

 

  1. package phoenics.context.code;   
  2.   
  3. /**  
  4.  * @author phoenics  
  5.  * Logic1  
  6.  */  
  7. public  class Logic1 implements LogicInterface{   
  8.  private int j=0;   
  9.   
  10.  /* (非 Javadoc)  
  11.   * @see phoenics.context.code.LogicInterface#doDelete(java.lang.String)  
  12.   */  
  13.  public void doInsert(String name) {   
  14.   System.out.println("Logic1...执行具体负责新增的业务逻辑…");   
  15.      
  16.         for (int i = 0; i < 100000000; i++) {   
  17.          j++;    
  18.                  //模拟执行时间   
  19.         }   
  20.  }   
  21.   
  22.  /* (非 Javadoc)  
  23.   * @see phoenics.context.code.LogicInterface#doInsert(java.lang.String)  
  24.   */  
  25.  public void doUpdate(String name) {   
  26.   System.out.println("Logic1...执行具体负责修改的业务逻辑…");   
  27.         for (int i = 0; i < 200000000; i++) {   
  28.          j++;    
  29.          //模拟执行时间   
  30.         }   
  31.  }   
  32.   
  33.  /* (非 Javadoc)  
  34.   * @see phoenics.context.code.LogicInterface#doUpdate(java.lang.String)  
  35.   */  
  36.  public void doDelete(String name) {   
  37.   System.out.println("Logic1...执行具体负责删除的业务逻辑…");   
  38.         for (int i = 0; i < 300000000; i++) {   
  39.          j++;    
  40.                  i = i / 0;//模拟异常发生   
  41.         }   
  42.  }   
  43. }   
  44.   
  45.   
  46. package phoenics.context.code;   
  47.   
  48. /**  
  49.  * @author phoenics  
  50.  * Logic2  
  51.  */  
  52. public class Logic2 {   
  53.  int j=0;   
  54.  // 负责新增   
  55.     public void doInsert(String name){   
  56.      System.out.println("Logic2...执行具体负责新增的业务逻辑…");   
  57.         for (int i = 0; i < 100000000; i++) {   
  58.          j++;    
  59.              //模拟执行时间   
  60.          }   
  61.     }   
  62.   
  63.     //负责修改   
  64.     public void doUpdate(String name){   
  65.               System.out.println("Logic2...执行具体负责修改的业务逻辑…");   
  66.               for (int i = 0; i < 200000000; i++) {   
  67.                j++;    
  68.                        //模拟执行时间   
  69.               }   
  70.     }   
  71.   
  72.     //负责删除   
  73.     public void doDelete(String name){   
  74.               System.out.println("Logic2...执行具体负责删除的业务逻辑…");   
  75.               for (int i = 0; i < 300000000; i++) {   
  76.                j++;    
  77.                        i = i / 0;//模拟异常发生   
  78.               }   
  79.     }   
  80.   
  81. }   
  82.   
  83.   

7,log类,增加两个method,一个用于INFO,另一个用于error

java 代码
  1. package phoenics.context.code;   
  2.   
  3. import org.apache.commons.logging.Log;   
  4. import org.apache.commons.logging.LogFactory;   
  5.   
  6. /**  
  7.  * @author phoenics  
  8.  * Logger  
  9.  */  
  10. public class Logger {   
  11.   private static Log log = LogFactory.getLog(Logger.class);   
  12.   public void entry_info(String message) {   
  13.     log.info(message);   
  14.   }   
  15.   public void entry_error(String message) {   
  16.   log.error(message);   
  17.   }   
  18. }   
  19.   

8,好了,现在才增加aop相关的类,先看代码

java 代码
  1. package phoenics.context.code;   
  2.   
  3. import org.aspectj.lang.JoinPoint;   
  4. import org.aspectj.lang.ProceedingJoinPoint;   
  5. import org.aspectj.lang.annotation.AfterThrowing;   
  6. import org.aspectj.lang.annotation.Around;   
  7. import org.aspectj.lang.annotation.Aspect;   
  8. import org.aspectj.lang.annotation.Pointcut;   
  9.   
  10. /**  
  11.  * @author phoenics  
  12.  * LogAspect  
  13.  */  
  14. @Aspect  
  15. public class LogAspect {   
  16.  /**  
  17.   * logger  
  18.   *  
  19.   */  
  20.  private Logger logger = new Logger();   
  21.     
  22.  @Pointcut("execution(public * *(..))")   
  23.  public void method1(){}   
  24.     
  25.  @Pointcut("within(phoenics.context.code.Logic2)")   
  26.  public void method2(){}   
  27.     
  28.  /**  
  29.   *   
  30.   * @param jp  
  31.   * @param ex  
  32.   */  
  33.  @AfterThrowing(   
  34.    pointcut="method1()",   
  35.    throwing="ex"  
  36.  )   
  37.  public void doExceptionActions(JoinPoint jp,Throwable ex ){   
  38.   String aa=jp.getSignature().getName();   
  39.   logger.entry_error(jp.getArgs()[0] + " run " + aa + " Throw...." + ex);   
  40.  }   
  41.     
  42.  /**  
  43.   *   
  44.   * @param p  
  45.   * @return  
  46.   * @throws Throwable  
  47.   */  
  48.  @Around("method2()")   
  49.  public Object doTimerActions(ProceedingJoinPoint p) throws Throwable{   
  50.   long procTime = System.currentTimeMillis();   
  51.   logger.entry_info(p.getArgs()[0] + " run Starting " + p.getSignature().getName() + " method");   
  52.   try {    
  53.     Object result = p.proceed();    
  54.           return result;    
  55.          } finally {    
  56.           //计算执行时间   
  57.           procTime = System.currentTimeMillis() - procTime;   
  58.           logger.entry_info(p.getArgs()[0] + " run " + p.getSignature().getName() + " method end");   
  59.           logger.entry_info( "run "+p.getSignature().getName() +" and run method in " + procTime + "ms");   
  60.          }   
  61.  }   
  62. }   
  63.   

这个里面有两个拦截的方法一个是doExceptionActions,拦截所有的发生异常的method,另一个doTimerActions,根据连接点看,它只会拦截phoenics.context.code.Logic2中的方法。

9,修改spring的配置文件exception_config.xml 

 

xml 代码

 

  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"        
  4.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          
  5.        xmlns:aop="http://www.springframework.org/schema/aop"          
  6.        xsi:schemaLocation=        
  7.        "http://www.springframework.org/schema/beans         
  8.        http://www.springframework.org/schema/beans/spring-beans.xsd         
  9.        http://www.springframework.org/schema/aop            
  10.        http://www.springframework.org/schema/aop/spring-aop.xsd">  
  11.           
  12.     <aop:aspectj-autoproxy proxy-target-class="true"/>     
  13.     <bean id="logic1" class="phoenics.context.code.Logic1"/>  
  14.     <bean id="LogBean1" class="phoenics.context.code.LogAspect"/>  
  15.     <bean id="logic2" class="phoenics.context.code.Logic2"/>  
  16.   
  17.      
  18.   
  19. beans>  

   <bean class="phoenics.context.code.Logic2" id="logic2"></bean>


10,编写测试类

java 代码
  1. package phoenics.context.test;   
  2.   
  3. import org.springframework.context.ApplicationContext;   
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;   
  5. import phoenics.context.code.Logic2;   
  6. import phoenics.context.code.LogicInterface;   
  7. /**  
  8.  * @author phoenics  
  9.  * TestAop  
  10.  */  
  11. public class TestAop {   
  12.  public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {   
  13.         //通过ApplicationContext获取配置文档   
  14.         ApplicationContext actx=new FileSystemXmlApplicationContext("exception_config.xml");   
  15.         LogicInterface logic1 = (LogicInterface)actx.getBean("logic1");   
  16.         Logic2 logic2 = (Logic2)actx.getBean("logic2");   
  17.         //模拟执行新增、修改、删除方法   
  18.         try {   
  19.          System.out.println("logic1 starting...");   
  20.             logic1.doInsert("张三");   
  21.             logic1.doUpdate("李四");   
  22.             logic1.doDelete("王五");   
  23.         } catch (Exception ex) {}   
  24.         try {   
  25.          System.out.println("logic2 starting...");    
  26.             logic2.doInsert("张三");   
  27.             logic2.doUpdate("李四");   
  28.             logic2.doDelete("王五");   
  29.         } catch (Exception ex) {}   
  30.  }   
  31. }   
  32.   

 11,看到的结果:

logic1 starting...
Logic1...执行具体负责新增的业务逻辑…
Logic1...执行具体负责修改的业务逻辑…
Logic1...执行具体负责删除的业务逻辑…
2007-10-26 20:31:53,390 ERROR (Logger.java:30) - 王五 run doDelete Throw....java.lang.ArithmeticException: / by zero
logic2 starting...
2007-10-26 20:31:53,421  INFO (Logger.java:27) - 张三 run Starting doInsert method
Logic2...执行具体负责新增的业务逻辑…
2007-10-26 20:31:53,625  INFO (Logger.java:27) - 张三 run doInsert method end
2007-10-26 20:31:53,625  INFO (Logger.java:27) - run doInsert and run method in 204ms
2007-10-26 20:31:53,625  INFO (Logger.java:27) - 李四 run Starting doUpdate method
Logic2...执行具体负责修改的业务逻辑…
2007-10-26 20:31:54,078  INFO (Logger.java:27) - 李四 run doUpdate method end
2007-10-26 20:31:54,078  INFO (Logger.java:27) - run doUpdate and run method in 453ms
2007-10-26 20:31:54,093  INFO (Logger.java:27) - 王五 run Starting doDelete method
Logic2...执行具体负责删除的业务逻辑…
2007-10-26 20:31:54,093  INFO (Logger.java:27) - 王五 run doDelete method end
2007-10-26 20:31:54,093  INFO (Logger.java:27) - run doDelete and run method in 0ms
2007-10-26 20:31:54,093 ERROR (Logger.java:30) - 王五 run doDelete Throw....java.lang.ArithmeticException: / by zero

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics