`
phoenics
  • 浏览: 1702 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

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

分享到:
评论

相关推荐

    Spring2.0整合Struts2.0

    Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力而闻名,而Struts2则是一款优秀的MVC框架,提供了良好的动作(Action)管理和结果映射功能。当我们需要构建复杂的企业级应用时,将两者整合能充分发挥它们...

    Spring 2.0 源代码

    2. **AOP(面向切面编程)**:Spring 2.0提供了更强大的面向切面编程支持,允许开发者定义切面、通知(advisors)和切点(pointcuts),并将其应用于业务代码,实现如日志、事务管理等功能。切面可以是接口、类或...

    Spring Security 2.0.x完全中文参考文档

    本文档旨在为用户提供一份详尽且全面的Spring Security 2.0.x版本的中文指南,它不仅覆盖了核心概念、配置方法以及实际应用案例,还深入探讨了安全框架的内部工作原理和技术细节。无论是初学者还是有一定经验的安全...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...

    Spring Framework2.0 中文开发参考手册

    2. **面向切面编程(AOP)**:Spring 2.0提供了强大的AOP支持,允许开发者定义方法拦截器和切面,实现如事务管理、日志记录等横切关注点的解耦。 3. **Web MVC**:Spring的Model-View-Controller(MVC)架构模式在...

    spring2.0技术手册--林信良

    Spring 2.0 通过代理机制实现了 AOP 支持,主要支持两种类型的代理: - **JDK 动态代理**:基于 JDK 的 Proxy 类实现,只能代理接口。 - **CGLIB 代理**:使用 CGLIB 库实现,可以直接代理类,无需实现接口。 ####...

    Spring Security 2.0 参考手册.pdf

    以上是Spring Security 2.0的一些核心概念和功能。虽然现在Spring Security已经发展到了更高级的版本,但2.0版本的基础依然牢固,许多核心理念和设计模式在后续版本中得以保留和改进。理解这些基础,将有助于开发者...

    DWR2.0 整合Spring2.0

    2. **AOP(面向切面编程)**:Spring的AOP模块允许我们在不修改源代码的情况下,对代码进行拦截和增强,实现如日志记录、权限控制等功能。DWR2.0可以通过Spring的AOP支持来实现这些功能,提升应用程序的安全性和可...

    spring2.0核心技术最佳实践源代码

    1. **AOP(面向切面编程)**:Spring 2.0在AOP方面有着强大的支持,允许开发者创建和管理横切关注点,如日志、事务管理和安全性。AOP通过定义切点、通知和组装切面来实现代码解耦,提高可维护性。 2. **事务管理**...

    spring2.0源码 struts1.2源码

    2. **面向切面编程(Aspect-Oriented Programming, AOP)**:Spring 2.0提供了基于代理的AOP实现,允许开发者定义切面,进行方法拦截,实现事务管理、日志记录等功能。 3. **Bean工厂和ApplicationContext**:Spring...

    Spring2.0jar包

    3. **spring-core-2.0.6.jar**:这是Spring框架的基础库,包含了基本的类型转换、资源处理和异常处理等功能。它还提供了IoC容器的基础支持,如ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,...

    ext2.0+struts2.1+spring2.0+jdbc框架

    标题 "ext2.0+struts2.1+spring2.0+jdbc框架" 提到的是一个基于Java的Web开发架构,它结合了四个关键组件:EXT JS的2.0版本,Struts2.1,Spring2.0,以及JDBC(Java Database Connectivity)。这个组合在早期的Web...

    Spring 2.0 MVC的应用

    Spring 2.0 MVC框架是Java Web开发中的一个重要里程碑,它极大地简化了企业...随着对Spring框架更深入的理解,开发者可以利用其强大的依赖注入、AOP(面向切面编程)和其他高级特性,构建更加复杂和健壮的企业级应用。

    Spring 2.0 AOP 完整例子

    网上找了很多例子多数都不能运行。包括after,before,round,throw切入,可对类直接拦截,不需要定义接口文件,自己研究了2天整理出来的。 Spring AOP 的完整例子,可直接运行。带jar包。

    Spring2.0的配置

    Spring 2.0 的配置是其核心特性之一,它引入了依赖注入(IOC)和面向切面编程(AOP)的概念,极大地简化了Java企业级应用的开发。然而,随着应用规模的扩大,配置文件的数量和复杂度也随之增加,特别是事务配置。在...

    Spring2.0使用说明书,pdf 格式

    Spring2.0支持JDK动态代理和CGLIB代理,允许在运行时创建AOP代理对象,实现对目标对象的增强。 综上所述,Spring2.0使用说明书详细阐述了这些关键特性的使用方法,是开发者理解和掌握Spring框架的宝贵资源。无论是...

    spring2.0学习的案例

    在Spring 2.0的学习过程中,我们主要会接触到一系列的核心概念和关键特性,这些知识点对于理解和掌握Spring框架至关重要。下面将详细阐述其中的关键点。 1. **IoC(Inversion of Control,控制反转)**: Spring的...

    Spring_2.0_Reference_zh_CN_中文帮助文档

    9. **Spring的扩展性**:Spring的模块化设计使得它可以很容易地扩展和定制,如自定义拦截器、AOP代理等。这部分会介绍如何利用Spring的API进行扩展。 10. **最佳实践**:文档最后通常会提供一些最佳实践和常见问题...

    struts2.0与spring2.0集成实例

    7. **最佳实践**:在实际开发中,集成Struts2和Spring可以遵循一些最佳实践,例如使用注解进行配置以减少XML的复杂性,使用Spring的AOP处理事务,以及利用Spring的MVC支持来简化视图和模型的处理。 8. **测试与调试...

    aopalliance

    AOPAlliance是一个开源项目,旨在为不同的AOP实现提供一个共同的接口,以便于在不同的AOP框架之间共享代码和实现互操作性。它定义了一些基础的AOP接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aop...

Global site tag (gtag.js) - Google Analytics