一、通知顺序
如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?Spring AOP使用AspectJ的优先级规则来确定通知执行顺序。总共有两种情况:同一切面中通知执行顺序、不同切面中的通知执行顺序。
首先让我们看下
1)同一切面中通知执行顺序:如图所示。
同一切面中的通知执行顺序
而如果在同一切面中定义两个相同类型通知(如同是前置通知或环绕通知(proceed之前))并在同一连接点执行时,其执行顺序是未知的,如果确实需要指定执行顺序需要将通知重构到两个切面,然后定义切面的执行顺序。
错误“Advice precedence circularity error”:说明AspectJ无法决定通知的执行顺序,只要将通知方法分类并按照顺序排列即可解决。
2)不同切面中的通知执行顺序:当定义在不同切面的相同类型的通知需要在同一个连接点执行,如果没指定切面的执行顺序,这两个通知的执行顺序将是未知的。
如果需要他们顺序执行,可以通过指定切面的优先级来控制通知的执行顺序。
Spring中可以通过在切面实现类上实现org.springframework.core.Ordered接口或使用Order注解来指定切面优先级。在多个切面中,Ordered.getValue()方法返回值(或者注解值)较小值的那个切面拥有较高优先级,如图所示。
两个切面指定了优先级
对于@AspectJ风格和注解风格可分别用以下形式指定优先级:
二、切面实例化模型
所谓切面实例化模型指何时实例化切面。
Spring AOP支持AspectJ的singleton、perthis、pertarget实例化模型(目前不支持percflow、percflowbelow 和pertypewithin)。
· singleton:即切面只会有一个实例;
· perthis:每个切入点表达式匹配的连接点对应的AOP对象都会创建一个新切面实例;
· pertarget:每个切入点表达式匹配的连接点对应的目标对象都会创建一个新的切面实例;
默认是singleton实例化模型,Schema风格只支持singleton实例化模型,而@AspectJ风格支持这三种实例化模型。
· singleton:使用@Aspect()指定,即默认就是单例实例化模式,在此就不演示示例了。
· perthis:每个切入点表达式匹配的连接点对应的AOP对象都会创建一个新的切面实例,使用@Aspect("perthis(切入点表达式)")指定切入点表达式;
如@Aspect("perthis(this(cn.javass.spring.chapter6.service.IIntroductionService))")将对每个匹配“this(cn.javass.spring.chapter6.service.IIntroductionService)”切入点表达式的AOP代理对象创建一个切面实例,注意“IIntroductionService”可能是引入接口。
· pertarget:每个切入点表达式匹配的连接点对应的目标对象都会创建一个新的切面实例,使用@Aspect("pertarget(切入点表达式)")指定切入点表达式;
如@Aspect("pertarget(target(cn.javass.spring.chapter6. service.IPointcutService))")将对每个匹配“target(cn.javass.spring.chapter6.service. IPointcutService)”切入点表达式的目标对象创建一个切面,注意“IPointcutService”不可能是引入接口。
在进行切面定义时必须将切面scope定义为“prototype”,如“<bean class="……Aspect" scope="prototype"/>”,否则不能为每个匹配的连接点的目标对象或AOP代理对象创建一个切面。
三、代理机制
Spring AOP通过代理模式实现,目前支持两种代理:JDK动态代理、CGLIB代理来创建AOP代理,Spring建议优先使用JDK动态代理。
JDK动态代理:使用java.lang.reflect.Proxy动态代理实现,即提取目标对象的接口,然后对接口创建AOP代理。
CGLIB代理:CGLIB代理不仅能进行接口代理,也能进行类代理,CGLIB代理需要注意以下问题:
不能通知final方法,因为final方法不能被覆盖(CGLIB通过生成子类来创建代理)。
会产生两次构造器调用,第一次是目标类的构造器调用,第二次是CGLIB生成的代理类的构造器调用。如果需要CGLIB代理方法,请确保两次构造器调用不影响应用。
Spring AOP默认首先使用JDK动态代理来代理目标对象,如果目标对象没有实现任何接口将使用CGLIB代理,如果需要强制使用CGLIB代理,请使用如下方式指定:
对于Schema风格配置切面使用如下方式来指定使用CGLIB代理:
<aop:config proxy-target-class="true"> </aop:config>
而如果使用@AspectJ风格使用如下方式来指定使用CGLIB代理:
<aop:aspectj-autoproxy proxy-target-class="true"/>
相关推荐
总结来说,"my-spring.rar-Spring-AOP源码Demo"提供了学习和研究Spring AOP的实例,涵盖了切面、通知、切入点等核心概念,通过分析源码,开发者能够深入理解Spring AOP的工作机制,并能将其应用于实际的项目开发中。
Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...
在本示例中,"Spring示例_Printer_Spring_AOP_Spring_Proxy" 主要关注的是Spring框架中的核心概念,特别是AOP(面向切面编程)和代理模式的应用。让我们深入探讨这些知识点。 首先,Spring框架是Java开发中最常用的...
5. **代理(Proxy)**:Spring AOP通过动态代理机制创建目标对象的代理,代理对象负责拦截方法调用并执行通知。有两种代理类型:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的目标对象,而CGLIB代理则用于没有...
面向切面编程(Aspect-Oriented Programming,AOP)是Spring框架的核心特性之一,它提供了一种优雅的方式来处理系统的横切关注点,如日志、事务管理、性能监控和权限控制等。在Spring中,AOP主要通过代理模式实现,...
3. **配置XML**: 在Spring的配置文件(如`applicationContext.xml`)中,你需要启用AOP代理并声明切面。首先,启用AOP上下文: ```xml <aop:config> </aop:config> ``` 然后,声明切面,指定其类和通知: ```...
Spring AOP(面向切面编程)是 Spring 框架的一个重要部分,它允许开发者在不修改源代码的情况下,实现跨切面的关注点,如日志、事务管理等。`spring-aop-3.0.xsd` 是 Spring AOP 的 XML 配置文件,定义了与 AOP ...
Spring框架是Java开发中最常用的轻量级框架之一,它的核心特性包括依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)。这两个概念是Spring框架的基石,极大地简化了...
Spring 4.2.5 版本是该框架的一个稳定版本,其中包含了核心组件、Bean、上下文和AOP(面向切面编程)等关键模块。下面我们将深入探讨这些关键知识点。 1. **Spring Core**: Spring Core 提供了框架的基础支持,...
6.3.5. 切面实例化模型 6.3.6. Advisors 6.3.7. 例子 6.4. AOP声明风格的选择 6.4.1. Spring AOP还是完全用AspectJ? 6.4.2. Spring AOP中使用@AspectJ还是XML? 6.5. 混合切面类型 6.6. 代理机制 6.7. 编程方式创建...
在Java开发中,Spring框架以其强大的功能和灵活性被广泛使用,而AOP(面向切面编程)则是Spring框架的一个重要特性。AOP为开发者提供了一种处理横切关注点的新方法,使得代码更加模块化,提高了可维护性和可复用性。...
4. **@EnableAspectJAutoProxy**:在Spring配置类中使用此注解启用AOP代理,使得Spring能自动扫描并处理切面。 5. **Spring MVC集成**:AOP可以与Spring MVC协同工作,比如在Controller层的方法调用中添加事务管理...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。本实例将深入探讨Spring AOP的核心概念、配置与...
在IT行业中,Spring框架是Java开发中...通过这个例子,开发者可以学习到如何在Spring环境中声明和使用DAO,以及如何创建和配置AOP切面以实现控制反转。这将有助于提升开发效率,降低代码间的耦合度,并使系统更加健壮。
在Spring框架中,动态代理和AOP(面向切面编程)是两个重要的概念,它们极大地增强了代码的可维护性和灵活性。下面将详细讲解这两个概念及其实际应用。 动态代理,是Spring提供的一种机制,允许我们在不修改原对象...
XSD文件在Spring框架中主要用来验证和解析基于XML的配置文件,例如`beans.xml`,这些文件定义了bean的实例化、依赖注入、AOP切面等配置。 压缩包内的子文件"spring-aop-4.2.xsd.txt"可能是XSD文件的文本版本,方便...
4. **Spring AOP**:在保护和审计方面,Spring的AOP功能可以用于实现日志记录、权限控制等切面。"protectionbkd"标签可能意味着案例中包含了一些关于安全防护或后台处理的代码。 5. **Spring MVC**:如果案例包含...
本章我们将深入探讨“反射机制”以及如何结合Spring AOP(面向切面编程)进行应用。反射是Java中的一种强大工具,允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态创建对象和调用方法。Spring AOP则是...
Spring.NET AOP(面向切面编程)是一种强大的设计模式,它允许程序员在不修改源代码的情况下,通过插入额外的行为来扩展或修改已有代码的功能。在本示例中,我们将深入探讨Spring.NET AOP如何实现动态代理,以及如何...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们可以实现如日志记录、事务...