Spring AOP底层详解:是不是就像给你家小区加个保安?

Spring Aop底层原理详解(利用spring后置处理器实现AOP) 写在前面:对于一个java程序员来说,相信绝大多数都有这样的面试经历,面试官问:你知道什么是aop吗?谈谈你是怎么理解aop的?等等诸如此类关于aop的问题。当然对于一些小白可能会一脸懵逼;对于一些工作一两年的,可能知道,哦!aop就是面向切面变成,打印日志啊,什么什么的,要是有点学习深度的呢可能会说aop底层实现利用了jdk动态代理,cglib啊什么的。很多时候可能面试就到此打住了,当然,然后也... 阅读详情

 一、AOP是什么?为什么需要它?  

如果你住在一个高档小区,每次进出都需要保安登记、电梯刷卡、门禁验证——这些流程虽然繁琐,但能保障安全。Spring AOP(面向切面编程) 就是代码世界的“保安系统”,它能将日志记录、权限校验、事务管理等横切关注点(CrossCutting Concerns)从业务逻辑中剥离,让核心代码更纯粹。

传统开发的痛点:  

• 代码臃肿:日志、事务代码重复出现在每个业务方法中,如“保安站岗在每个房门口”。  

• 耦合度高:修改安全规则时,需逐个修改所有相关方法,容易遗漏或出错。  

AOP通过动态代理技术,在不修改源码的情况下,为代码插入统一的增强逻辑。就像小区统一部署智能门禁系统,所有住户无需自己装锁,却享受更高效的安全管理。

 二、AOP的核心三要素:切面、切点、通知  

1. 切面(Aspect)  

   定义一组公共行为(如日志记录),相当于“保安系统”的规则手册。通过@Aspect注解标识:

   @Aspect

   publicAspect { / ... / }

2. 切点(Pointcut)  

   描述哪些方法需要增强,类似“所有住户的入户门”。使用AspectJ表达式定义范围:

   @Pointcut("execution( com.example.service..(..))")

   public void serviceMethods() {}

   

3. 通知(Advice)  

   具体增强逻辑的执行时机,分为五种类型:

   • @Before:方法执行前(如登记访问记录)  

   • @After:方法执行后(无论成功或异常)  

   • @AfterReturning:方法正常返回后(如记录成功日志)  

   • @AfterThrowing:方法抛出异常后(如报警通知)  

   • @Around:包裹整个方法(可控制是否执行原方法,常用于性能监控。

 三、动态代理:AOP的“两把钥匙”  

Spring AOP的底层实现依赖两种动态代理技术,如同打开增强逻辑的钥匙:

1. JDK动态代理  

   • 条件:目标类实现了接口  

   • 原理:通过Proxy.newProxyInstance()生成接口的代理类,拦截方法调用并插入增强逻辑。  

   • 示例:若UserService实现了IService接口,代理对象会实现IService并重写方法。

2. CGLIB代理  

   • 条件:目标类未实现接口  

   • 原理:通过继承目标类生成子类,重写父类方法实现增强(需注意final类无法代理)。  

   • 优势:无需接口支持,适用于遗留代码改造。

Spring的选择策略:默认优先使用JDK代理,若目标类无接口则切换至CGLIB。

 四、AOP的执行流程:从配置到拦截  

1. 容器启动阶段  

   • 扫描切面:识别所有@Aspect注解的类,解析切点和通知。  

   • 生成代理对象:通过AnnotationAwareAspectJAutoProxyCreator(Bean后置处理器)动态创建代理类替换原始Bean。

2. 方法调用阶段  

   • 拦截请求:代理对象接管方法调用,根据切点匹配是否需增强。  

   • 执行通知链:若匹配成功,按顺序执行环绕通知→前置通知→目标方法→后置通知→最终通知。  

   • 异常处理:若目标方法抛出异常,则触发@AfterThrowing通知。

关键设计:  

• 拦截器链(Interceptor Chain):多个通知封装为拦截器,形成责任链模式。  

• MethodInvocation对象:封装方法调用上下文,支持递归执行拦截器链。

 五、AOP的哲学思考:解耦与效率的平衡  

1. 模块化思维的胜利  

   AOP将横切关注点抽象为独立模块,如同将小区安保外包给专业公司,让开发者专注业务逻辑的“房屋装修”。

2. 性能与灵活性的权衡  

   动态代理通过反射或字节码增强实现,虽带来轻微性能损耗(约10%20%),但在大多数场景下,其提升的代码可维护性远大于此代价。

3. 设计模式的集大成者  

   AOP融合了代理模式、责任链模式、工厂模式,体现了“组合优于继承”的设计原则。例如,ProxyFactory封装了代理对象的创建过程。

 六、源码级透视:AnnotationAwareAspectJAutoProxyCreator  

Spring AOP的核心类AnnotationAwareAspectJAutoProxyCreator(名字长但功能明确)的工作流程:

1. Bean初始化后介入:通过postProcessAfterInitialization方法拦截Bean的创建。  

2. 筛选候选Advisor:从容器中获取所有切面,匹配当前Bean是否需要代理。  

3. 创建代理对象:根据条件选择JDK或CGLIB生成代理类,如:

   

   // JDK代理核心代码

   Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {

       public Object invoke(Object proxy, Method method, Object[] args) {

           // 执行拦截逻辑

       }

   });

   

4. 方法拦截:调用JdkDynamicAopProxy.invoke()或CglibAopProxy.intercept()执行通知链。

结语:AOP与IOC的“黄金组合”  

如果说IOC是Spring的“骨架”,AOP则是“神经系统”——前者管理对象的生命周期,后者控制行为增强。二者共同构建了Spring的松耦合架构。想要深入理解AOP,不妨从AbstractAutoProxyCreator和ProxyFactoryBean的源码入手,感受“动态织入”的精妙设计。正如小区有了智能安保才能成为现代化社区,代码有了AOP才能真正迈向高内聚、低耦合的优雅境界。  

PS:如果还不了解IOC可以看看上一篇文章哦

(本文参考Spring 5.3.x源码及多篇技术博客整理,推荐阅读org.springframework.aop.framework包下的核心类。)

Spring AOP详解 一、AOP 1.1、AOP介绍 1.1.1、什么是AOP? 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从... 阅读详情

相关推荐

Spring Aop详解

什么是AOP?AOP英文全称:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。那什么又是面向方法编程呢,为什么又需要面向方法编程呢?来我们举个例子做一个说明:比如,我们这里有一个项目,项目中开发了很多的业务功能。然而有一些业务功能执行效率比较低,执行耗时较长,我们需要针对于这些业务方法进行优化。那首先第一步就需要定位出执行耗时比较长的业务方法,再针对于业务方法再来进行优化。

Delu3376451753的博客 1403

详解Spring AOP

Aspect Oriented Programming(面向切面编程),OOP是面向对象编程(开发的时候把一个个都抽象成对象来开发),两者的维度不同,处理的事情不同切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程。面向切面编程就是针对某一类特定问题统一进行编程比如people类有自己的属性和行为,但是有小一部分人生病要去医院看病,看病这个业务逻辑就不属于哪一个类,因为people泛指所有人,所有人不会都看病。

N_0050的博客 2030

WRF后处理避坑指南:从namelist配置到降水计算的全流程解析

本文提供了一份详尽的WRF模式后处理避坑指南,涵盖从理解wrfout文件结构、核心变量解析到累计降水计算与专业气象图绘制的全流程。重点解析了RAINC与RAINNC的正确处理方法,并分享了使用wrf-python库高效绘制位势高度叠加风场图、累计降水图等专业图表的实战技巧与代码,旨在帮助用户规避常见错误,提升后处理效率与图表质量。

weixin_29200485的博客 353

Spring AOP 详解

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架提供的一种编程范式,它允许开发者将横切关注点(如日志、事务管理、权限检查等)与业务逻辑分离,从而提高代码的模块化和可维护性。Spring AOP 基于代理机制实现,它为Spring应用提供了声明式事务管理等功能。

2301_80035594的博客 6824

React 源码解析 | Reconcile协调过程

上篇讲了React的工作流程,这篇详细的讲一下render过程中的beginWork函数,也就是深度优先创建Fiber树中"递"的过程。beginWork函数传入当前已经创建好的Fiber节点,返回创建/复用的第一个子FIber节点,也就是wip.child在renderRoot中,在开始创建整棵FIber树之前,会先调用prepareRefreshStack创建/复用一个新的HostRootFiber。

weixin_40710412的博客 1220

MIKE11实战:平原河网水动力建模从入门到精通(附GIS数据处理技巧)

本文系统介绍了MIKE11软件在平原河网水动力建模中的完整实战流程。从GIS数据预处理、河网构建、参数率定到结果分析,详细阐述了构建可靠数字孪生模型的关键步骤与技巧,旨在帮助水利工程师高效解决平原地区复杂水流模拟的挑战,为防洪决策提供科学依据。

weixin_28419039的博客 689

【Spring】aop的底层原理

Spring的切面编程是通过AOP(面向切面编程)机制来实现。AOP是一种编程范式,旨在将横切关注点(如日志记录、事务管理等)与核心业务逻辑分离,以提高代码的模块性、可重用性和可维护性。

dandelionl_的博客 4973

假新闻检测论文分享(25)L-DefenseExplainable Fake News Detection With Large Language Model

现有的假新闻检测工作主要集中在通过深度网络结合多种信息来学习假新闻的潜在特征,如可信度、立场、传播模式、额外知识、域外数据等。尽管他们在探测上取得了成功,但受限于他们的黑箱性质,他们无法提供任何对公众至关重要的理由。为解决这一问题,一些研究致力于可解释假新闻检测(EFND),旨在同时生成准确性预测和解释。许多工作通过注意力机制在相关报道中注意突出特别的单词、短语或句子来提供可解释性。然而,这些工作只发现了对最终预测有高贡献的区域,缺乏直观和可信的解释。

weixin_41964296的博客 731

Spring AOP原理底层实现详解

Spring AOP原理底层实现详解。

大户影视的博客 1973

PyTorch生成式人工智能(7)——生成对抗网络(Generative Adversarial Network, GAN)实践详解

生成对抗网络 (Generative Adversarial Network, GAN) 最早由 Ian Goodfellow 于 2014 年提出,其中生成器试图创建与真实样本无法区分的数据样本,而判别器则试图区分生成器生成的样本与真实样本。在本节中,我们将介绍 GAN 的理论基础。然后,介绍如何使用 PyTorch 从零开始构建 GAN,以便了解所有细节,深入理解 GAN 的内部工作原理,为后续讨论 GAN 的其他更高级内容奠定基础,比如生成高分辨率图像或逼真的音乐。

盼小辉丶的博客 1万+

一张微服务地图的十年演进:Spring Cloud 核心、扩展与工具组件的定位、原理与选型

本文把 Spring Cloud 当作一张微服务地图来读:先说明它是由 Commons 抽象层、实现层和 Boot 装配层构成的发行版,再沿一次请求梳理注册发现、负载均衡、声明式调用、容错限流、网关、配置、追踪与总线七类核心组件的原理与换代,并扩展到云平台、服务网格、消息流、批处理、安全与周边生态。仿真实测:默认参数下实例宕机平均 242 秒才被感知,优雅下线降到 47 秒;一个慢实例让轮询的 P99 达 49 秒,P2C 仅 203 毫秒。最后给出退场替代表、技术栈组合、升级路线和决策树。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 169万+

手撕Spring底层系列之:IOC、AOP

优秀的框架设计,往往是把复杂留给自己,把简单留给使用者。Spring的成功正是这一理念的完美实践——通过IoC容器标准化对象生命周期,通过AOP解耦横切关注点,最终实现开发效率的质的飞跃。IoC的本质是管理权转移:将对象的控制权从程序员手中移交至容器,通过三级缓存等精妙设计解决工程难题AOP的根基是代理模式:动态代理技术使非侵入式功能扩展成为可能,JDK与CGLIB的互补成就了Spring的灵活性手写轮子的终极意义。

Rqaqedamancy的博客 1万+

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 122

spring AOP详解

AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程(OOP)的一种补充和完善;

是程序喵呀 4199

Nexys4DDR+OV7670实现图像灰度显示系统嵌入式

通过对硬件平台的准备、Vivado工程配置、OV7670驱动程序的编写、图像灰度处理算法的设计以及系统集成与测试,我们成功实现了一个基于嵌入式系统的图像处理应用。当系统运行时,OV7670摄像头模块将采集到的图像传输到FPGA芯片中,然后通过图像灰度处理算法将彩色图像转换为黑白图像,并在显示设备上进行显示。OV7670摄像头模块的驱动程序是实现图像采集的核心。以上代码中,我们使用了Xilinx提供的XGpio和Xil_In32函数来进行OV7670摄像头数据的读取和GPIO的初始化。OV7670驱动程序。

WangWEel的博客 338

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

全网最强剖析Spring AOP底层原理

本文深入讲解了Spring AOP的核心原理,从静态代理模式入手,通过房东出租房屋的案例形象说明代理模式的运作机制。静态代理虽然直观,但存在类文件过多、维护性差等缺点。随后重点介绍了Spring动态代理的实现方式,详细分析了开发步骤:创建原始对象、定义额外功能、定义切入点和组装切面。文章特别强调了动态代理通过字节码技术在JVM运行时创建代理类的特点,以及相比静态代理在维护性和扩展性上的优势。最后对额外功能中的MethodBeforeAdvice接口及其参数进行了详细解析。全文结合代码示例和示意图,帮助读者深

qq_45832461的博客 2500

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

spring aop详解

1.前言 spring aop是一个面向切面的编程,在自己第一遍学习的时候,感觉aop没有什么作用,但是真实接触下来,感觉spring aop还是很有用途的,感觉自己之前的想法太年轻了。 2.概念 Spring 提供了两种AOP 的实现:基于注解式配置和基于XML配置,我这里主要就是介绍一下,基于注解式配置。 2.1 AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。 所谓的核心业务,工作中做的最多的

hanbin1998的博客 6563

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Spring AOP底层实现

Spring AOP底层实现

qq_54356614的博客 1120

Spring框架之AOP动态代理底层实现原理

本文摘要: 本章介绍了AOP的基础实现,重点讲解了JDK动态代理在Spring中的应用。内容包括: AOP概念与实现方式对比:Spring AOP采用动态代理,而AspectJ基于编译期增强 JDK动态代理核心机制:通过Proxy.newProxyInstance创建代理对象,InvocationHandler实现方法增强 示例代码展示:演示了如何创建代理对象并实现前置/后置增强逻辑 Spring的扩展实现:介绍了ReflectiveMethodInvocation类,该类封装方法调用信息,为拦截器链式调用

几许的博客 1553

Spring实现IOC和AOP的底层原理

Spring框架是Java企业级应用开发中的核心框架之一,其核心思想可以概括为IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。IOC通过依赖注入实现对象之间的解耦,而AOP则提供了一种在不修改源代码的情况下,为程序动态添加额外功能的技术手段。本文将深入探讨Spring实现IOC和AOP的底层原理。Spring的IOC和AOP是实现松耦合、高内聚和代码复用的重要手段。

qq_30009397的博客 2102

【JavaEE进阶】Spring AOP详解

AOP是Aspect Oriented Programming的简称(又称为面向切⾯编程)什么是面向切面编程呢?切面就是指某⼀类特定问题,所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢?比如在前面文章实现的的"登录校验",就是⼀类特定问题.登录校验拦截器,就是对"登录校验"这类问题的统⼀处理.所以,拦截器也是AOP的⼀种应用.AOP是⼀种思想,拦截器是AOP思想的⼀种实现.Spring框架实现了这种思想,提供了拦截器技术的相关接⼝.

2301_81510374的博客 1399

spring IOC和AOP的底层实现

spring IOC和AOP的底层实现 https://juejin.im/post/5bf51d4c5188256d9832b0d3 IOC 2、spring核心主要两部分: (1)aop:面向切面编程:扩展功能不是修改源代码实现 (2)Ioc:控制反转,比如有一个类,在类里面有方法(不是静态的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象。 现在对象的创建不是通过n...

兰陵鸡王的博客 3770

Spring AOP底层原理源码详解

Spring AOP 本质是动态代理 + 责任链模式的结合,通过代理对象在目标方法执行前后织入增强,实现横切逻辑与业务逻辑的解耦。理解 ProxyFactory、InvocationHandler(或 MethodInterceptor)、MethodInvocation 的交互是掌握源码的关键。

qq_74798973的博客 938
上一篇: Spring IOC 底层详解:本质就和做饭与点外卖差不多!
下一篇: Java深度解析:hashCode与equals的核心区别与协同机制
程序员Zeel
博客等级 码龄4年 70粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值