spring的AOP组件

简介:
spring的AOP组件是基于这样一种思想:让程序员把分散在代码中的重复功能提取出来,单独编写成一个类(spring叫通知advice),通过动态代理的手段再加入到需要它的地方。
 
1>.spring要求advice要按照它的要求进行编写。它给提供了四个接口可供使用,以便在目标方法执行的不同时期不同情况下,能够触发执行advice里的方法:
    MethodBeforeAdvice:在目标方法调用之前触发执行它的方法before(...);
   AfterReturningAdvice:在目标方法返回值之前触发执行它的方法afterReturning(...);
   MethodInterceptor:      可以在它的方法invoke(...)执行过程中调用目标方法;
   ThrowsAdvice:             在目标方法发生异常时触发执行它实现类里面的方法afterThrowing(...)。
 
2>.spring通过类org.springframework.aop.framework.ProxyFactoryBean来实现把advice和目标类结合起来完成动态代理功能,向用户提供所需要的代理类。
 
目标类实现的接口:
public  interface StudentDao { 
   public  void test1(); 

   public  void test2()  throws Exception; 
}
 
目标类:
public  class StudentDaoImpl  implements StudentDao { 
   public  void test1() { 
     try { 
      Thread.sleep(2000); //用来使测试时间更加明显 
    }  catch (InterruptedException e) { 
      e.printStackTrace(); 
    } 
    System.out.println( "@@@@执行目标方法:test1()@@@@"); 
  } 
    
   public  void test2()  throws Exception { 
    System.out.println( "####执行目标方法:test2()####"); 
     throw  new SQLException( "test2 has SQLException"); 
  } 
}
 
Advice:
public  class SecurityAdvice  implements MethodBeforeAdvice { 
   /*    
    * method: 目标方法 
    * args: 目标方法的参数列表 
    * target: 目标对象 
    */
 
  @Override 
   public  void before(Method method, Object[] args, Object target) 
       throws Throwable { 
    System.out.println( "====security check for: "+method.getName()+ " ===="); 
  } 
}
 
public  class LoggingAdvice  implements AfterReturningAdvice { 
   /*    
    * returnValue: 目标方法的返回值 
    * method: 目标方法 
    * args: 目标方法的参数列表 
    * target: 目标对象 
    */
 
  @Override 
   public  void afterReturning(Object returnValue, Method method, Object[] args, 
      Object target)  throws Throwable { 
    System.out.println( "****"+method.getName()+ " run at "+ new Date()+ " ****"); 
  } 
}
 
public  class PerformanceAdvice  implements MethodInterceptor { 
   /** 
    * invocation: 是对目标方法的一个封装,不但包含了目标方法本身以及它的参数列表,还包括目标对象. 
    */
 
  @Override 
   public Object invoke(MethodInvocation invocation)  throws Throwable { 
    Long beginTime=System.currentTimeMillis(); 
    Object ret=invocation.proceed(); //对外提供了此方法,用来执行目标方法. 
    Long endTime=System.currentTimeMillis(); 
    System.out.println( "####"+invocation.getMethod().getName()+ " used "+(endTime-beginTime)+ " ms####"); 
     return ret; 
  } 
}
 
public  class MyThrowsAdvice  implements ThrowsAdvice { 
   /** 
    * ThrowsAdvice接口本身并不包含任何方法,但spring要求它里面要触发的方法必须叫afterThrowing,并且允许程序员无限重载之。其实这也是不得已的做法,因为spring不可能事先定义好目标方法要发生的所有异常情况,交给程序员自行处理也许是个最好的选择。
    *需要特别指出的是:当异常发生重叠时,它采用的是最精确匹配执行。
    * @param e: 目标方法抛出的异常对象 
    */
 
   public  void afterThrowing(Exception e) { // 目标方法发生Exception时执行本方法 
    System.out.println( "@@@@catch Exception " + e.getMessage() +  "@@@@"); 
  } 

   public  void afterThrowing(RuntimeException e) { // 目标方法发生RuntimeException时执行本方法 
    System.out.println( "@@@@catch RuntimeException " + e.getMessage()+  "@@@@"); 
  } 

   public  void afterThrowing(SQLException e) { // 目标方法发生SQLException时执行本方法 
    System.out.println( "@@@@catch SQLException " + e.getMessage() +  "@@@@"); 
  } 

   public  void afterThrowing(IOException e) { // 目标方法发生IOException时执行本方法 
    System.out.println( "@@@@catch IOException " + e.getMessage() +  "@@@@"); 
  } 
}
 
配置文件:
< beans > 
   < bean  id ="target"  class ="com.yangfei.spring.advice.StudentDaoImpl" > 
   </ bean > 
   < bean  id ="before"  class ="com.yangfei.spring.advice.SecurityAdvice" > </ bean > 
   < bean  id ="after"  class ="com.yangfei.spring.advice.LoggingAdvice" > </ bean > 
   < bean  id ="interceptor"  class ="com.yangfei.spring.advice.PerformanceAdvice" > </ bean > 
   < bean  id ="throws"  class ="com.yangfei.spring.advice.MyThrowsAdvice" > </ bean > 
   < bean  id ="dao"  class ="org.springframework.aop.framework.ProxyFactoryBean" > 
     < property  name ="target" ><!--  目标类 --> 
       < ref  bean ="target" /> 
     </ property > 
     < property  name ="interceptorNames" ><!--  Adivice --> 
       < list > 
         < value >before </ value > 
         < value >after </ value > 
         < value >interceptor </ value > 
         < value >throws </ value > 
       </ list > 
     </ property > 
     < property  name ="interfaces" ><!--  目标类实现的接口 --> 
       < list > 
         < value >com.yangfei.spring.advice.StudentDao </ value > 
       </ list > 
     </ property > 
   </ bean > 
</ beans >
 
测试类:
   public  static  void main(String[] args)  throws Exception{ 
    ApplicationContext ctx= new ClassPathXmlApplicationContext( "test.xml"); 
    StudentDao dao=(StudentDao)ctx.getBean( "dao"); 
    dao.test1(); 
    System.out.println(); 
    dao.test2(); 
  }
 
运行结果:
====security check for: test1 ====
@@@@执行目标方法:test1()@@@@
####test1 used 2000 ms####
****test1 run at Sat Dec 19 10:04:28 CST 2009 ****
 
====security check for: test2 ====
####执行目标方法:test2()####
@@@@catch SQLException test2 has SQLException@@@@
Exception in thread "main" java.sql.SQLException: test2 has SQLException
 at com.cernet.spring.advice.StudentDaoImpl.test2(StudentDaoImpl.java:30)
.......




     本文转自NightWolves 51CTO博客,原文链接:http://blog.51cto.com/yangfei520/245613 ,如需转载请自行联系原作者
相关文章
|
27天前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
2月前
|
Java Spring
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面
|
26天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
27天前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
11天前
|
缓存 Java 开发者
Spring高手之路22——AOP切面类的封装与解析
本篇文章深入解析了Spring AOP的工作机制,包括Advisor和TargetSource的构建与作用。通过详尽的源码分析和实际案例,帮助开发者全面理解AOP的核心技术,提升在实际项目中的应用能力。
9 0
Spring高手之路22——AOP切面类的封装与解析
|
29天前
|
安全 Java 开发者
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
27 1
|
29天前
|
Java Spring
Spring的AOP组件详解
该文章主要介绍了Spring AOP(面向切面编程)组件的实现原理,包括Spring AOP的基础概念、动态代理模式、AOP组件的实现以及Spring选择JDK动态代理或CGLIB动态代理的依据。
Spring的AOP组件详解
|
1月前
|
Java API Spring
Spring Boot 中的 AOP 处理
对 Spring Boot 中的切面 AOP 做了详细的讲解,主要介绍了 Spring Boot 中 AOP 的引入,常用注解的使用,参数的使用,以及常用 api 的介绍。AOP 在实际项目中很有用,对切面方法执行前后都可以根据具体的业务,做相应的预处理或者增强处理,同时也可以用作异常捕获处理,可以根据具体业务场景,合理去使用 AOP。
|
11天前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
24 0
|
18天前
|
Java 开发工具 Spring
【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达
【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达