Spring AOP在什么场景下会失效?

什么是Spring AOP?

Spring AOP是Spring框架中的一个重要组成部分,它提供了一种面向切面编程(Aspect-Oriented Programming, AOP)的实现方式。AOP的核心思想是将那些分布在多个对象或方法中的共同行为(即横切关注点)提取出来,形成一个独立的模块,称为“切面”(Aspect)。这样做的好处是可以增强的代码模块化,减少重复代码,提高系统的可维护性可扩展性

Spring AOP 基于什么实现?

Spring AOP 的实现主要基于动态代理和字节码增强两种技术

首先,Spring AOP利用动态代理技术在运行时生成代理对象,这些代理对象能够拦截对目标对象的调用,并在调用前后执行切面逻辑。具体来说,如果目标对象实现了接口,Spring AOP会使用JDK动态代理来生成代理对象;而如果目标对象没有实现接口,Spring AOP则会使用CGLIB动态代理来生成代理对象。

其次,Spring AOP还利用了AspectJ框架来实现字节码增强。这是一种在编译时或运行时修改目标对象的字节码的技术,以此来插入切面的逻辑。通过这种方式,即使不改变源代码,也能够为程序添加额外的功能

Spring AOP在什么场景下会失效?

一,Java动态代理失效的场景 Spring AOP一定会失效 二,其他场景

以下是一些可能导致Spring AOP失效的场景:

  1. 静态方法:AOP不能代理静态方法,因为静态方法属于类级别,而不是实例级别,所以无法通过代理机制进行拦截。
  2. 内部类:如果目标方法是内部类的实例方法,那么AOP也无法进行代理,因为内部类的实例化是在外围类的实例化之后,此时AOP代理已经创建完成。
  3. Spring版本兼容性问题:不同版本的Spring框架可能在AOP的实现上存在差异,如果遇到AOP失效的问题,也需要考虑是否是由于Spring版本升级导致的兼容性问题。
  4. 当前类没有被Spring容器所管理: Spring AOP 在Bean 创建的初始化之后阶段进行, 当前类没有被Spring容器所管理, SpringAOP失效.
  5. Transactional注解:在使用@Transactional注解进行事务管理时,如果在同一个类中的方法调用另一个带有@Transactional注解的方法,那么内部调用可能不会触发AOP代理,因为默认使用的是this引用而不是代理对象。
  6. 同一个类中方法的调用:  this调用,不走代理,AOP不生效,  解决:引入当前类
  7. 嵌套调用:当在一个类的方法内部直接调用该类的另一个方法时,由于代理对象无法介入这种内部调用,因此AOP不会生效。这种情况下,可以通过将需要被AOP处理的方法移动到另一个类中,或者使用AopContext.currentProxy()来获取代理对象并进行调用。和第6点一个意思
  8. 异常处理:如果在目标方法中捕获了所有异常,而AOP中的环绕通知(around advice)抛出了异常,那么这个异常可能会被目标方法中的异常处理逻辑所吞没,导致AOP失效。
  9. 方法访问修饰符:如果目标方法是private或final的,AOP将无法对其进行代理,因为这些方法无法被子类覆盖或外部访问。
  10. ApplicationContext未注入:如果需要在Service层使用AOP,并且Service实现了ApplicationContextAware接口,但没有正确注入ApplicationContext,那么AOP也可能失效。确保在Service实现类中正确注入ApplicationContext,以便能够获取到代理对象。
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值