springboot2.x AOP 默认使用Cglib 源码

一、背景

在 SpringBoot 2.x AOP中会默认使用Cglib来实现,但是Spring5中默认还是使用jdk动态代理。Spring AOP 默认使用 JDK 动态代理,如果对象没有实现接口,则使用 CGLIB 代理。也可以强制使用 CGLIB 代理。springboot默认使用cglib实现代码逻辑来记录一下。

二、自动配置

1、springboot aop自动配置类为AopAutoConfiguration.java

@Configuration
@ConditionalOnClass({EnableAspectJAutoProxy.class, Aspect.class, Advice.class, AnnotatedElement.class})
@ConditionalOnProperty(prefix = "spring.aop",name = {"auto"},havingValue = "true",matchIfMissing = true
)
public class AopAutoConfiguration {public AopAutoConfiguration() {}@Configuration@EnableAspectJAutoProxy(proxyTargetClass = true)@ConditionalOnProperty(prefix = "spring.aop",name = {"proxy-target-class"},havingValue = "true",matchIfMissing = true)public static class CglibAutoProxyConfiguration {public CglibAutoProxyConfiguration() {}}@Configuration@EnableAspectJAutoProxy(proxyTargetClass = false)@ConditionalOnProperty(prefix = "spring.aop",name = {"proxy-target-class"},havingValue = "false",matchIfMissing = false)public static class JdkDynamicAutoProxyConfiguration {public JdkDynamicAutoProxyConfiguration() {}}
}

2、 CglibAutoProxyConfiguration上注解

@ConditionalOnProperty(
prefix = “spring.aop”,
name = {“proxy-target-class”},
havingValue = “true”,
matchIfMissing = true
)
当spring.aop.proxy-target-class是否配置都会设置成true.关于ConditionalOnProperty注解参数可以参照这个博客

3、 @EnableAspectJAutoProxy(proxyTargetClass = true)这个注解中导入@Import(AspectJAutoProxyRegistrar.class)

在这里插入图片描述
可以看到把beanName:org.springframework.aop.config.internalAutoProxyCreator
,类型为:AnnotationAwareAspectJAutoProxyCreator的proxyTargetClass 属性设置成true。
在这里插入图片描述

三、bean在spirng中被代理过程

1、不存在循环依赖的时候

bean属性赋值后,发生在bean initializeBean初始化方法applyBeanPostProcessorsAfterInitialization后置处理中。
执行AbstractAutoProxyCreator的后置处理方法,如果没有调用过三级缓存earlyProxyReferences中就没有存储当前对象名称。如图1
在这里插入图片描述
wrapIfNecessary->createProxy-> proxyFactory.getProxy
在这里插入图片描述

在这里插入图片描述

当这三个条件都满足时,会使用jdk动态代理.
!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)
看一下ProxyConfig和AnnotationAwareAspectJAutoProxyCreator的继承关系,可以发现自动配置中设置的ProxyTargetClass=true其实就是设置父类中proxyConfig中的属性。config.isProxyTargetClass()是true,所以执行cglib动态代理创建。isOptimize配置文件可以配置,默认为false
hasNoUserSuppliedProxyInterfaces可以理解为判断被代理类是否有实现接口。
在这里插入图片描述

2、循环依赖的时候

populateBean属性赋值前,三级缓存中vulue存入函数式接口,this.singletonFactories.put(beanName, singletonFactory);当调用getObject方法时,会执行getEarlyBeanReference(beanName, mbd, bean)。前
先看一下getEarlyBeanReference这个方法,再看什么时候执行三级缓存中的函数式接口。遍历所有后置处理器,会执行AbstractAutoProxyCreator的getEarlyBeanReference方法,如下图可以看到earlyProxyReferences放入值,防止初始化中后置处理器会判断是有值,防止重复创建代理类,可以往上翻看图1。wrapIfNecessary方法和无循环依赖方法一样,这里不再赘述。
在这里插入图片描述
下面看一下什么时候会执行三级缓存里面的函数式接口。如果A中有属性B,B中有属性A,当创建A的时候,A在属性赋值前三级缓存存入A的创建代理类的函数式接口。当A属性赋值时,会创建B,因为B有属性A,又会重新进入创建A的逻辑,doGetBean->getSingleton
在这里插入图片描述
如果一级和二级缓存都没有值,就会获取三级缓存函数式接口,执行getObject(),返回代理对象,把代理对象存入二级缓存,最后返回代理对象完成B的属性A的赋值。A继续完成B的属性赋值把创建完成的类再放入一级缓存。可以看到如果有循环依赖会在属性赋值时完成代理类的创建,而不会到后置处理器。这也是三级缓存的作用就是完成循环依赖的创建代理对象。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246486.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主&#x…

使用assembly插件来将外部文件夹打进jar包

目录&#xff1a; 1、pom文件的配置2、新建assembly的描述文件3、maven打包 1、pom文件的配置 <!--maven构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</ar…

python自动化之用flask校验接口token(把token作为参数)

用到的库&#xff1a;flask 实现效果: 写一个接口&#xff0c;需要token正确才能登录 代码&#xff1a; # 导包 from flask import Flask,request,jsonify,json # 创建一个服务 appFlask(__name__) # post请求&#xff0c;路径&#xff1a;/query app.route(/query, met…

ESP32部署TensorFlow Lite

本来是想找一篇中文教程&#xff0c;不过只看到一个英文官方的&#xff0c;也行吧&#xff0c;虽然效率会慢丢丢。 GitHub - espressif/esp-tflite-micro: TensorFlow Lite Micro for Espressif Chipsets 看了一圈&#xff0c;有个中文的&#xff1a; esp-dl/README_cn.md a…

C语言 ——— 编写代码,判断 整型数组 是否 有序

目录 题目要求 代码实现 题目要求 判断 整型数组 是否有序 如果 整型数组 有序输出 sorted&#xff1b;否则输出 unsorted 代码实现 #include<stdio.h> int main() {int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]);//输入for (int i 0; i < sz; i){s…

5个超牛的Java开源OA项目(强烈推荐)

1. O2OA ——开源地址&#xff1a;https://gitee.com/o2oa/O2OA 概述&#xff1a; O2OA 是一款真正全代码&#xff08;包含服务器、安卓以及IOS客户端&#xff09;开源的企业应用定制化开发平台&#xff0c;适用于企业OA、协同办公类信息化系统的建设和开发。技术&#xff1a;…

【JavaScript 算法】栈与队列:解决括号匹配问题

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、总结 在编程中&#xff0c;括号匹配问题是一类常见的算法题&#xff0c;通常用于验证括号的正确性&#xff0c;即检查括号是否成对出现且嵌套正确。栈&#xff08;Stack&#xff0…

Uniapp基础篇(持续更新)

1. Uni-app常用内置组件 view 视图容器 scroll-view 可滚动视图区域&#xff0c;用于区域滚动。需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 swiper 滑块视图容器。一般用于左右滑动或上下滑动&#xff0c;比如banner轮播图。 image uniapp官方iam…

软件测试——非功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

微软的vscode和vs2022快捷键官网链接

vscode官方文档:https://code.visualstudio.com/docs/ vscode快捷键官方文档:https://code.visualstudio.com/docs/getstarted/keybindings vs2022官方文档:https://learn.microsoft.com/zh-cn/visualstudio/ide/?viewvs-2022 vscode快捷键官方文档:https://learn.microsoft.c…

Spring Cloud环境搭建

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 开发环境安装 1.1 安装JDK ​1.2 安装MySQL 2. 案列介绍 2.1 …

【顺序表】算法题 --- 力扣

一、移除元素 移除元素 这个题让我们移除数组nums中值为val的元素&#xff0c;最后返回k&#xff08;不是val的元素个数&#xff09; 这样显然我们就不能再创建一个数组来解决这个问题了&#xff0c;只能另辟蹊径 思路&#xff1a;双指针 这里定义两个指针&#xff08;l1&…

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版!!!】

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版&#xff01;&#xff01;&#xff01;】 一、引言 作为一名开发者&#xff0c;我经常在Windows和Ubuntu之间切换&#xff0c;以满足不同的开发需求。最近&#xff0c;我在使用惠普暗影精灵9&#xff08;搭载RTX 4…

算法力扣刷题记录 四十九【112. 路径总和】和【113. 路径总和ii】

前言 二叉树篇继续。 记录 四十九【112. 路径总和】和【113. 路径总和ii】 一、【112. 路径总和】题目阅读 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 target…

框架设计MVC

重点&#xff1a; 1.用户通过界面操作&#xff0c;传输到control&#xff0c;control可以直接去处理View&#xff0c;或者通过模型处理业务逻辑&#xff0c;然后将数据传输给view。 2.control包含了model和view成员。 链接&#xff1a; MVC框架详解_mvc架构-CSDN博客 MVC架…

vue 给特定满足条件的表单数据添加背景颜色,组件的 row-class-name

1、:row-class-name"tableRowClassName" 可为表格每行根据后面的函数绑定class名 <!-- 列表框 --><div class"tableList"><el-table :data"teamModelListTable" style"width: 100%"selection-change"handleSele…

【Sklearn-驯化】一文搞懂sklearn中特征平滑之-贝叶斯平滑策略使用技巧

【Sklearn-驯化】一文搞懂sklearn中特征平滑之-贝叶斯平滑策略使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容…

C++ std::lock_guard和 std::unique_lock

二者都是 C 标准库中用于管理互斥锁&#xff08;mutex&#xff09;的 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制的类。这些类可以确保互斥锁在构造时被获取&#xff0c;在析构时被释放&#xff0c;从而避免死锁和资源泄漏问题。不过&#xff0c…

在SpringCloud中如何轻松实现微服务间的通信

在Spring Cloud中&#xff0c;实现微服务间的通信非常简单。Spring Cloud提供了多种方式来进行微服务之间的通信&#xff0c;包括使用RestTemplate、Feign、Ribbon、Eureka等组件。下面我将详细介绍这些方式的使用方法。 使用RestTemplate进行通信&#xff1a; RestTemplate是S…

MongoDB常用命令大全,概述、备份恢复

文章目录 一、MongoDB简介二、服务启动停止、连接三、数据库相关四、集合操作五、文档操作六、数据备份与恢复/导入导出数据6.1 mongodump备份数据库6.2 mongorestore还原数据库6.3 mongoexport导出表 或 表中部分字段6.4 mongoimport导入表 或 表中部分字段 七、其他常用命令八…