【zz】Spring AOP 拦截
在Spring 的AOP中,如果一个Proxy同时实现MethodBeforeAdvice、AfterReturningAdvice和MethodInterceptor接口,那么这三个Advice的执行顺序是什么样的呢?
经过试验,是和xml文件中的定义顺序有关的。
如果Proxy的接口实现定义为
MethodBeforeAdvice
AfterReturningAdvice
MethodInterceptor
那么执行的结果是
MethodBeforeAdvice
MethodInterceptor: before call
Really method excuting
MethodInterceptor: after call
AfterReturningAdvice
也就是说,执行顺序是:MethodBeforeAdvice,MethodInterceptor的调用前的部分,目标方法,MethodInterceptor的调用后的部分,AfterReturningAdvice。
如果proxy的定义是
MethodBeforeAdvice
MethodInterceptor
AfterReturningAdvice
执行的结果是
MethodBeforeAdvice
MethodInterceptor: before call
Really method excuting
AfterReturningAdvice
MethodInterceptor: after call
也就是说,执行的顺序是:MethodBeforeAdvice,MethodInterceptor的调用前的部分,目标方法,AfterReturningAdvice,MethodInterceptor的调用后的部分。
如果proxy的定义是
MethodInterceptor
MethodBeforeAdvice
AfterReturningAdvice
执行的结果是:
MethodInterceptor: before call
MethodBeforeAdvice
Really method excuting
AfterReturningAdvice
MethodInterceptor: after call
也就是说,执行的顺序是:MethodInterceptor的调用前的部分,MethodBeforeAdvice,目标方法,AfterReturningAdvice,MethodInterceptor的调用后的部分。
以上的顺序是在springframework
1.2.5中测试的。
================================================================
本人总结:
MethodBeforeAdvice
AfterReturningAdvice
MethodInterceptor
目标方法之前的拦截的优先级表现:优先级越高,越先拦截
目标方法之后的拦截的优先级表现:优先级越高,越后拦截
在xml文件中,ProxyFactoryBean.interceptorNames配置顺序决定advice的执行顺序
又:
如 果有多个通知想要在同一连接点运行会发生什么?Spring AOP遵循跟AspectJ一样的优先规则来确定通知执行的顺序。 在“进入”连接点的情况下,最高优先级的通知会先执行(所以给定的两个前置通知中,优先级高的那个会先执行)。 在“退出”连接点的情况下,最高优先级的通知会最后执行。(所以给定的两个后置通知中, 优先级高的那个会第二个执行)。
当定义在不同 的切面里的两个通知都需要在一个相同的连接点中运行, 那么除非你指定,否则执行的顺序是未知的。你可以通过指定优先级来控制执行顺序。 在标准的Spring方法中可以在切面类中实现org.springframework.core.Ordered
接口或者用Order注解做到这一点。在两个切面中, Ordered.getValue()方法返回值(或者注解值)较低的那个有更高的优先级。
当 定义在相同的切面里的两个通知都需要在一个相同的连接点中运行, 执行的顺序是未知的(因为这里没有方法通过反射javac编译的类来获取声明顺序)。 考虑在每个切面类中按连接点压缩这些通知方法到一个通知方法,或者重构通知的片段到各自的切面类中 - 它能在切面级别进行排序。
参考:《spring 揭秘》
此外,如果定义了ThrowingAdvice,那么将对增强后的方法进行异常捕获处理。
分享到:
相关推荐
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、日志记录等。AOP的核心概念是切面(Aspect)和通知(Advice)...
在这个名为"springAOP-dome"的实例中,我们将探讨如何利用Spring AOP实现一个简单的日志记录功能,以作为入门学习。 首先,了解AOP的基本概念是必要的。面向切面编程是一种编程范式,旨在解决程序中的横切关注点,...
**Spring AOP的执行顺序** 1. **前置通知**:在目标方法执行前运行。 2. **环绕通知**:包裹整个目标方法,可以在方法执行前后插入自定义代码,可以决定是否执行目标方法。 3. **目标方法**:如果未被环绕通知阻止...
**Spring AOP 知识点详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在程序运行时动态插入代码的能力,以实现跨切面的关注点,如日志、事务管理、权限...
### Spring之AOP配置文件详解 #### 一、前言 在Java开发中,Spring框架因其强大的功能和灵活的配置而被广泛应用于企业级应用的开发。其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring框架的...
Spring AOP执行先后顺序实例详解 Spring AOP(Aspect-Oriented Programming)是一种面向方面的编程思想,它可以将散乱、分散的关注点(Concerns)模块化,通过方面(Aspect)来封装这些关注点,从而实现松耦合、...
Spring AOP,全称为Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式事务管理、日志记录、性能监控等跨切面关注点的解决方案。本教程将深入探讨Spring AOP...
在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的功能之一就是AOP(面向切面编程)。本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是...
4. **使用AOP**:现在,当我们的业务代码(在切入点表达式匹配的方法上)被调用时,切面中的通知将会按顺序执行。例如,每次调用`com.example.service`包下的任何方法时,`logBefore`和`logAfter`方法都会自动执行。...
本资料"Java进阶之SpringAOP应用共16页.pdf"深入探讨了Spring AOP在实际开发中的应用和实现原理,旨在提升Java开发者的技能水平。 首先,理解AOP的基本概念至关重要。AOP是一种编程范式,它将关注点分离为不同的...
在实际应用中,这三个jar包的使用顺序通常是这样的:首先,`aopalliance.jar`提供了通用的AOP接口;然后,`aspectjrt.jar`让Spring可以利用AspectJ提供的强大功能;最后,`aspectjweaver.jar`确保了切面的正确织入。...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它通过预定义的切点(Pointcut)来拦截方法的调用,并将横切关注点(如日志、事务管理等)与业务逻辑分离。本知识点将围绕Spring AOP的核心组件进行分析...
这种方式需要在Spring配置文件中定义切入点表达式、通知类型以及通知的执行顺序。 1. **切入点表达式(Pointcut Expression)**: 切入点表达式是AOP的核心,它定义了哪些方法会被切面所影响。例如,`execution(* ...
Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的重要特性之一,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。在本示例中,我们将通过两个小例子来深入理解Spring AOP...
在Spring框架中,从2.0版本开始支持两种方式来使用AOP:基于AspectJ注解的AOP以及基于XML配置的AOP。 4. 在Spring中启用AspectJ注解支持 要在Spring应用中使用AspectJ注解,需要在classpath下包含三个JAR文件:aop...
- **日志输出**:可能包含了执行AOP增强后的日志信息,有助于理解通知的执行顺序和效果。 - **XML配置文件**:展示了如何在Spring的XML配置文件中声明AOP的相关设置,如启用AOP、注册切面等。 学习这个Demo,你需要...
《Spring AOP 深入理解与应用》 在Java世界中,Spring框架以其强大的功能和易用性,成为企业级应用开发的首选。而Spring AOP(Aspect Oriented Programming,面向切面编程)作为Spring框架的重要组成部分,为开发者...
Spring AOP,全称为Aspect-Oriented Programming,即面向切面编程,是Spring框架的核心特性之一。它提供了一种在不修改源代码的情况下对程序进行功能增强的技术,主要用于解决系统中的横切关注点,如日志、事务管理...
Spring会按照`interceptors`属性中定义的顺序,依次调用每个拦截器的`invoke()`方法。在这个方法中,拦截器可以执行预处理、后处理逻辑,甚至可以决定是否继续调用下一个拦截器或目标方法。 在实际应用中,...