Spring源码 之 AOP动态代理源码分析——基础篇

【微服务】Spring Aop原理深入解析 spring原理深度解析 阅读详情

目录

1、Spring Aop是什么及实现原理概述

2、情景再现

3、源码分析


1、Spring Aop是什么及实现原理概述

简单来说spring aop就是面向切面编程,对切面执行前置、后置等回调逻辑,实现功能增强。Spring AOP的实现对于接口来说使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现。

2、情景再现

①、cglib动态代理

在我自己的项目中创建了一个类

然后是aspect对类方法拦截,如下:

config类配置开启aop,proxyTargetClass这里我没有配置,其实从spring5开始默认使用的是jdk的动态代理

接下来我们看在这种情景下,使用的是那种代理方式

debug断点显示使用的是cglib代理,而且此时不管我proxyTargetClass设置为true还是false,使用的都是cglib代理,其实结果不难想象使用的就应该是cglib代理,因为此时我只有一个测试类,对类进行代理。

再来看下面一种场景。

②、基于接口的代理实现

首先是接口和接口实现类

方法前置通知

首先看看proxyTargetClass默认这种情况下是使用的哪种代理实现

很容易看出,使用的是jdk的代理。

再看一下如果proxyTargetClass = true,再看一下结果。

很明显又重新使用的是cglib的代理。

小小的总结:如果对于给定的类进行代理,只会使用cglib进行代理,如果给定接口和实现类,则我们可以动态的配置proxyTargetClass来决定使用哪种代理。

3、源码分析

知其然也要知其所以然,接下来从源码层面进行挖掘是如何控制代理的动态选择的。

首先第一步可以确定容器在启动成功之后就已经给我们创建好了各种bean,如果我们debug住先不getBean然后会发现,在bean工厂的单例池singletonObjects

中可以看到完全创建好的bean

然后我们的目标就是找到在源码中到底在哪里决定使用cglib还是jdk,正如上面所说,spring把所有bean创建完成之后会放入单例池中singletonObjects中,那我们就从放入singletonObjects为突破口进行排查,全局搜索singletonObjects.put方法在哪里使用的

很明显,在第一个地方(箭头所指)就是我们想要的,我们点进去,先不管这个方法是干嘛的,打个断点先,然后重启项目,看调用栈。

然后将beanName跳到我们自己的bean,便于查看执行流程。

根据调用栈我们来到getSingleton方法的246行,发现这个方法最终返回的是singletonObject,猜想这个应该就是返回代理类的,那么生成代理类就一定在这个方法里面,在方法里搜索singletonObject果不其然发现了方法singletonFactory.getObject();如果debug查看的话其实确实就是这个方法生成的,所以我们家进入这个方法,来到doGetBean的createBean方法

继续往里走,来到AbstractAutowireCapableBeanFactory.createBean方法,这个方法其他都是一些准备工作,核心在下面

沿着doCreateBean继续往里调用,里面调用的这个方法返回的是exposeObject,经debug排查查看这个对象状态会发现是在以下这个调用被生成了代理

使用同样的方式,我们查看里面调用的这个方法的这个wrappedBean的状态,发现生成代理是后置处理器起的作用

继续往里走,发现是遍历所有的后置处理器,执行业务逻辑,我们用debug调试到aop的后置处理器AnnotationAwareAspectAutoProxyCreator

然后进入后置处理器的方法内发现代理的生成还是通过wrapIfNecessary这个方法返回的。

进入到wrapIfNecessary这个方法,很容易看到有个createProxy方法返回了proxy,进入到createProxy,这个方法里面主要完成了两件事情,准备代理工厂和返回代理Bean

进入到getProxy方法,发现里面有两个方法调用。

第二个getProxy点进去我们发现其实现类就是cglib和jdk的代理选择,所以第一个方法的目的一定是选择其实现类来决定是调用cglib还是jdk去生成代理。于是进入第一个方法里面。

很明显第二个箭头才是生成代理,进去看看

看到下面这些代码就豁然开朗了,这才是决定使用cglib还是jdk由于JdkDynamicAopProxy和ObjenesisCglibAopProxy都实现了AopProxy,所以刚才getProxy方法调用的时候使用哪种实现是在这里返回不同的实现类决定的。

返回实现类后就是各自底层的代理生成了。而且这里我们同样也看到了proxyTargetClass是怎么起作用的。

个人才疏学浅,信手涂鸦,spring框架更多模块解读相关源码持续更新中,感兴趣的朋友请移步至个人公众号,谢谢支持😜😜......

公众号:wenyixicodedog

通达信缠论中枢自动识别与画线实战指南 本文详细介绍了通达信缠论中枢自动识别与画线公式的实战应用。该工具通过严谨的算法逻辑,自动在K线图上标记出符合缠论定义的中枢区间,帮助投资者摆脱繁琐的手工画图,聚焦于价格与中枢的互动关系,从而高效识别趋势延续、背驰及第三类买卖点,提升缠论分析与交易决策的效率。 阅读详情

相关推荐

基于DE2-115红外解码实验

基于DE2-115红外解码实验   一、   功能描述 在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型, 这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。只有知道编码方式,我...

乘风的博客 2515

Spring源码分析のAOP

在Spring中,AOP通常是通过动态代理实现的,通过运行时增强的机制,以实现在目标代码执行前后的统一的逻辑。而Spring将两大动态代理,封装成为了,在@Component同时在/*** 方法执行前后执行*//***/@OverrideSystem.out.println("方法执行前");System.out.println("方法执行后");/*** 抛出异常后执行*/在中添加切面,其中Advisor是Advice + Pointcut组合,等于切入点+切面。

西岭千秋雪的博客 838

PX4无人机-Gazebo仿真实现动态目标追踪的视觉控制方案

本文详细介绍了PX4无人机在Gazebo仿真环境中实现动态目标追踪的视觉控制方案。从PX4与Gazebo仿真环境搭建、动态目标追踪核心技术栈、仿真环境深度定制技巧到追踪算法的优化实践,提供了全面的技术指导和常见问题排查方法,帮助开发者高效实现无人机视觉追踪功能。

weixin_29196315的博客 450

Spring源码系列(九)——AOP动态代理源码分析

Spring源码系列(九)——AOP动态代理源码分析

scorpio的博客 932

C++cgal库配置+VS2017

Cgal几何图形库在VS2017上的下载、安装与配置。想要一口气下载完所有安装配件的,可以去文章末尾的链接。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。

dsn3S的博客 1489

别再让充电器‘罢工’了!聊聊Charger里VIN-DPM这个不起眼但关键的功能

本文深入探讨了充电IC中的VIN-DPM(输入电压动态电源管理)功能,揭示其如何智能调节充电策略以避免电源适配器过载。通过实际案例和实验室数据,展示了VIN-DPM在提升充电稳定性和效率中的关键作用,并提供了选型、设计和故障排查的实用指南。

weixin_33738578的博客 416

Aop源码分析

执行之后,打印了前置通知,后置通知,和异常通知,也拿到了方法的名字,参数和异常信息。可以看到这次拿到了结果。

qq_21277357的博客 439

深入解析π型滤波电路:RC与LC滤波器的实战选型指南

本文深入解析了π型滤波电路的工作原理与实战选型。重点对比了RC型与LC型滤波器的核心差异:RC型成本低、体积小,但存在压降与能耗,适用于小电流场景;LC型效率高、滤波性能好,但成本与体积较大,适合中到大电流及高纹波抑制需求。文章提供了基于不同应用场景的选型指南与设计要点,帮助工程师做出精准决策。

weixin_29291069的博客 656

Spring AOP proxyTargetClass 行为表现总结

proxyTargetClass true 目标对象实现了接口 – 使用CGLIB代理机制 目标对象没有接口(只有实现类) – 使用CGLIB代理机制 false 目标对象实现了接口 – 使用JDK动态代理机制(代理所有实现了的接口) 目标对象没有接口(只有实现类) – 使用CGLIB代理机制 ...

Details Inside Spring 1万+

31、工程中不确定性量化与优化的全面解析

本文全面解析了工程中不确定性量化与优化的关键方法。针对数据充足与不足两种情况,分别介绍了概率理论和非概率方法在不确定性建模中的应用;系统阐述了采样方法、FORM/SORM、泰勒级数近似等不确定性传播技术;深入比较了RBDO与RDO两种主流优化框架的原理、步骤及适用场景,并通过两杆桁架案例展示了具体实现过程。文章旨在为工程师提供一套完整的从不确定性分析到优化设计的方法论,提升工程系统的可靠性与稳健性。

php55的博客 121

第133章 PCL OrientedBoundingBox 有向包围盒

中文叫有向包围盒,是一种旋转过的包围盒。特点:不像AABB那样固定朝向坐标轴能更紧密地包裹物体适用于复杂姿态的物体,比如倾斜、旋转的物体通常通过PCA、惯性矩等算法确定方向。

yumeiguo的博客 264

Spring源码解析之Aop

/ 缓存机制if (!// 判断该Bean是否已经被增强(advisedBeans为已经增强过的Bean)// 2.1.1 判断是否为基础类型(isInfrastructureClass)或者 2.1.2 判断是否需要跳过的Bean// 如果我们有一个自定义的TargetSource,则在此处创建代理。// 这段源码要抑制目标bean的不必要的默认实例化:TargetSource将以自定义方式处理目标实例。// 2.1.3 自定义目标资源,对于单实例Bean必定会返回null。

xxxzzzqqq_的博客 401

【论文解读】Baidu Apollo EM Motion Planner

系统顶层是一种多车道策略,通过并行计算车道级别轨迹来处理车道变更场景;在车道轨迹生成器内部,迭代的解决基于Frenet坐标的路径和速度规划;针对路径和速度规划问题,提出了动态规划与基于样条的二次规划相结合的方法,构造了一个可扩展且易于调整的框架,同时处理交通规则、障碍物决策和平滑度问题。该规划器可扩展至高速公路和城市低速驾驶场景。高精地图模块提供了任何人都可以访问的高精地图。感知和定位模块提供了动态环境中必要的信息。运动规划模块考虑生成一条安全平滑的轨迹再交由汽车的控制模块去执行。

xiewf的博客 6093

【2022】软件笔录&&日记

【一月份笔录】 2022-01-01 Sentinel基础使用 2022-01-02 Sentinel源码分析 Sentinel与Springboot的整合方法 责任链设计模式 这条责任链是如何构造而成的 每个槽位的大概职责 源码入口 自动配置类SentinelAutoConfiguration -> SentinelResourceAspect(注意这个类是AOP切面类,使用了环绕通知) -》SphU.entry方法 -〉构造责任链 -》依次调用链子上的每一个槽位 ...

qq_37023928的博客 388

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

源码分析:Spring是如何实现AOP的?

Spring AOP硬核文章,建议收藏!!!

果子爸聊技术 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入理解 Spring AOP 源码分析(附源码分析)

Spring AOP 是一个非常常见的概念,使用了 Spring 的项目大多数也都用了 Spring AOP 的功能,比如我们常见的日志统计、事务管理等,AOP 的全称是 “Aspect Oriented Programming”,也是我们常说的⾯向切⾯编程,那你真的了解 Spring AOP 的原理吗?

weixin_42118323的博客 2351

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Spring-AOP基础】深入浅出Spring-AOP(从动态代理到Spring AOP)

AOP(Aspect Oriented Programming) 1.概念 AOP:全称是 Aspect Oriented Programming即:面向切面编程。

ATFWUS的博客 11万+

【spring源码】AOP底层源码分析

【spring源码】AOP底层源码分析1.测试用例2.AOP流程概述3.AOP源码分析 spring的AOP是什么不在赘述,以下内容默认大家会使用AOP,我们今天来扒源码 1.测试用例 引入必要依赖: <dependencies> <dependency> <groupId>org.springframework&l...

aaa_bbb_ccc_123_456的博客 1万+

Spring源码解析之四 ------ AOP原理和源码分析

在介绍AOP之前,想必很多人都听说AOP是基于动态代理和反射来实现的,那么在看AOP之前,你需要确实弄懂动态代理和反射。 巧了,我这里就有。 JDK的动态代理的实现和源码分析,参见我的这两篇文章 JDK的动态代理源码分析之一   (   http://blog.youkuaiyun.com/weililansehudiefei/article/details/73655925  ) JDK的动态代理源

怪盗基德 6241

从源码解读Spring的AOP

概念 IOC和AOP作为Spring的两大核心,如果你接触过Spring框架,那就一定需要了解这两个核心部分的工作原理。IOC控制反转(或者说依赖注入)的部分已经在我的从源码解读Spring的IOC文章中有介绍,这篇文章主要来讲解AOP面向切面编程的原理 AOP,即Aspect Oriented Programming,面向切面编程,关于什么是面向切面编程,为了避免喧宾夺主,我在这里不进行过多的探...

Ekmr的博客 4504

Spring AOP 源码解读

name: spring-aop-source title: Spring AOP 源码解析 date: 2020-03-25 15:03:38 tags: spring-aop-source categories: 文章目录前言本文使用的调试代码IOC 容器管理 AOP 实例ProxyFactory 详解基于注解的 Spring AOP 源码分析闲聊 InstantiationAwareBeanPostProcessor小结 之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希.

孤刺 4074

Spring AOP源码分析

目录 1、AOP是什么 2、AOP 的作用及其优势 3、AOP 的底层实现 3.1 JDK动态代理: 3.2 CGLIB动态代理 4、AOP相关概念 5、AOP运行流程图 6、AOP源码解析 6.1 源码解析须知 6.2 注册自动代理创建器 6.3 触发后置处理器 6.4 创建Proxy过程分析 6.5 代理回调增强 6.6 增强器执行 6.7 增强器执行顺序 7、源码总结 1、AOP是什么 AOP 为 Aspect Oriented Programming ..

长沙老码农 2447

Spring中AOP相关的API及源码解析,原来AOP是这样子的

Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring中的对象跟Bean,你知道Spring怎么创建对象的吗? 这篇文章,我们来谈一谈Spring中的属性注入 推荐阅读: Spring官网阅读 | 总结篇 Spring杂谈 本系列文章将会带你一行行的将Spring的源码吃透,推荐阅读的文章是阅读源码的基础! 因为本文会涉及到动态代理的相关内容,如果对动态代理不

做一个认真的程序员 1万+

Spring AOP源码分析,动态代理与调用确实难,那是因为你没有看这篇文章!

本文目标:带领大家阅读aop的源码,深入理解aop的原理,内容有点长,消化需要大概一周时间,做好准备。 Aop原理介绍 介绍aop相关的一些类 通过源码详解aop代理的创建过程 通过源码详解aop代理的调用过程 Aop代理一些特性的使用案例 最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚:获取面试资料只需:[点击这里领取!!!] 暗号:优快云

a646705816的博客 4762

【Spring源码分析】Spring之AOP底层源码解析和@Async源码解析

Spring AOP 本质是通过CGLIB动态代理去实现的,它内部是使用的 ProxyFactory 去获取的代理对象,ProxyFactory 支持 JDK 和 CGLIB 动态代理,但是 Spring AOP 在实例化 ProxyFactory 的时候,是使用的 CGLIB 动态代理去获取的代理对象。当代理对象执行方法的时候,首先是去找到ProxyFactory中符合的Advisor,通过里面的Pointcut去筛选,然后将里面的Advice封装成MethodInterceptor对象,最后行成

qq_63691275的博客 1620

Spring源码分析十一:AOP源码分析

Spring源码分析十一:AOP源码分析

我从不打没有准备的仗! 9347
上一篇: MySQL锁的类型,以及加锁的原理
下一篇: 为什么Redis Cluster中至少应该有三个结点?
wenyixicodedog
博客等级 码龄8年 87粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值