当前位置: 首页 > news >正文

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,以便能够获取到代理对象。

相关文章:

  • CDH6.3.1离线安装
  • 组合_回溯法_java
  • 【数据集】MSWEP(多源加权集合降水)再分析数据
  • 大模型交互-超拟人合成
  • 【算法可视化】模拟算法专题
  • Python接口自动化测试框架运行原理及流程
  • 【leetcode】随机链表的复制
  • Nginx使用—基础应用
  • 图像处理与视觉感知---期末复习重点(1)
  • 如何在Spring Boot框架中打印响应的日志?
  • 【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)
  • js如何渲染页面
  • [渗透教程]-024-Hashcat密码破解
  • LLM(十一)| Claude 3:Anthropic发布最新超越GPT-4大模型
  • Python 开发图形界面程序
  • [iOS]Core Data浅析一 -- 启用Core Data
  • es6(二):字符串的扩展
  • ES6语法详解(一)
  • go append函数以及写入
  • JavaScript函数式编程(一)
  • Java知识点总结(JavaIO-打印流)
  • Puppeteer:浏览器控制器
  • react 代码优化(一) ——事件处理
  • SSH 免密登录
  • TypeScript迭代器
  • Yeoman_Bower_Grunt
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 闭包--闭包作用之保存(一)
  • 创建一种深思熟虑的文化
  • 仿天猫超市收藏抛物线动画工具库
  • 构建工具 - 收藏集 - 掘金
  • 京东美团研发面经
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 模型微调
  • 如何设计一个比特币钱包服务
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 源码安装memcached和php memcache扩展
  • 栈实现走出迷宫(C++)
  • linux 淘宝开源监控工具tsar
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​queue --- 一个同步的队列类​
  • # Apache SeaTunnel 究竟是什么?
  • $$$$GB2312-80区位编码表$$$$
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (四)c52学习之旅-流水LED灯
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ./configure,make,make install的作用(转)
  • .NET Core 版本不支持的问题
  • .NET MVC第三章、三种传值方式