Bean的生命周期与循环依赖

如有不对的地方,还请大佬指正

Bean生命周期

扫描类 得到 BeanDefinition(包含bean的class等属性值)  
后在BeanFactoryPostProcessor对bean实例化之前对Bean的元数据进行操作,修改Bean的属性值、添加自定义的BeanDefinition
实例化非懒加载单例bean1. 实例化2. 属性填充         (自定义属性赋值)  3. Aware回调     (Aware只作为标识,根据标识给对应属性赋值,容器对象属性赋值)4. 初始化5. 添加到单例池

image-20231209181253972

扫描,得到BeanDefiniction–>BeanFactoryProcessor修改Bean的属性值–>实例化Bean–>设置bean对象的自定义属性–>判断Aware接口对容器对象属性赋值–>BeanPostProcessor(Aop)前置处理–>初始化(判断是否实现了initialzingBean,初始化属性)–>BeanPostProcessor后置处理–bean初始化完成–>使用–>销毁

bean的生命周期

依赖循环

依赖循环

二级缓存主要作用是保持未经过完全生命周期的Bean的单例。

构造器注入是没法通过三级缓存解决的

三级缓存存放的是创建对象的工厂,ObjectFactory,相当于延迟初始化。在AOP或者解决循环依赖时,通过调用Object的getObject()方法获取到第三级缓存中的对象。并且可以在调用时候,来判断返回的到底需要返回的代理对象还是原始对象

为什么要引入三级缓存
第三级缓存并非缺它不可,因为可以提前创建代理对象
但是提前创建代理对象会破坏spring的设计原则(尽可能地保证普通对象创建完成之后,再生成aop代理,即尽可能延迟代理对象的生成)
所以spring用来三级缓存,既维持了设计原则,又处理了循环依赖;牺牲了一点内存空间是可以接受的

为什么Sping不选择二级缓存方式,而是要额外加一层缓存?
如果要使用二级缓存解决循环依赖,意味着Bean在构造完后就创建代理对象,这样违背了Spring设计原则。Spring结合AOP跟Bean的生命周期,是在Bean创建完全之后通过AnnotationAwareAspectJAutoProxyCreator这个后置处理器来完成的,在这个后置处理的postProcessAfterInitialization方法中对初始化后的Bean完成AOP代理。如果出现了循环依赖,那没有办法,只有给Bean先创建代理,但是没有出现循环依赖的情况下,设计之初就是让Bean在生命周期的最后一步完成代理而不是在实例化后就立马完成代理

自动装配原理

1、当启动springboot应用程序的时候,会先创建SpringApplication的对象,在对象的构造方法中会进行某
些参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在这个过程中会加载整个应用
程序中的spring.factories文件,将文件的内容放到缓存对象中,方便后续获取。

2、SpringApplication对象创建完成之后,开始执行run方法,来完成整个启动,启动过程中最主要的有两个
方法,第一个叫做prepareContext,第二个叫做refreshContext,在这两个关键步骤中完整了自动装配的核心功
能,前面的处理逻辑包含了上下文对象的创建,banner的打印,异常报告期的准备等各个准备工作,方便后续来
进行调用。

3、在prepareContext方法中主要完成的是对上下文对象的初始化操作,包括了属性值的设置,比如环境对
象,在整个过程中有一个非常重要的方法,叫做load,load主要完成一件事,将出並应就美<为个
beanDefinition注册到registry中,方便后续在进行BeanFactoryPostProcessor调用执行的时候,找到对应的主
类,来完成@SpringBootApplicaiton,@EnableAutoConfiguration等注解的解析工作

4、在refreshContext方法中会进行整个容器刷新过程,会调用中spring中的refresh方法,refresh中有13个
非常关键的方法,来完成整个spring应用程序的启动,在自动装配过程中,会调用
invokeBeanFactoryPostProcessor方法,在此方法中主要是对ConfigurationClassPostProcessor类的处理,这次
是BFPP的子类也是BDRPP的子类,在调用的时候会先调用BDRPP中的postProcessBeanDefinitionRegistry方
法,然后调用postProcessBeanFactory方法,在执行postProcessReanDefinitionRegistry的时候回解析处理各种
注解,包含@PropertySource,@ComponentScan,@ComponentScans,@Bean,@lmport等注解,最主要的是
@lmport注解的解析

5、在解析@lmport注解的时候,会有一个getlmports的方法,从主类开始递归解析注解,把所有包含
@lmport的注解都解析到,然后在processlmport方法中对lmport的类进行分类,此处主要识别的时候
AutoConfigurationlmportSelect归属于ImportSelect的子类,在后续过程中会调用
deferredlmportSelectorHandler中的process方法,来完整EnableAutoConfiguration的加载。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给返修就能炫耀几年?16.4的高分,指标优秀,行业公认top 1顶刊!

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;社科均可&#xff09; EI • 计算机工程类&#xff08;接收广&#xff0c;录用极快&#xff09; SCI&EI • 4区生物医学类&#xff0c;1.5-2.0&#xff08;录用率99%&#xff09; • 1区工程类&#…

【C++初阶】string模拟实现

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

基于微信小程序+JAVA Springboot 实现的【网上商城小程序】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 基于微信小程序的网上商城 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java, SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信开发者工具&#xff0c;微信小程序框架 项目展示 5.1 管理员服务…

uos server 无法通过ssh工具连接

问题现象 uos server 服务器操作系统 在虚拟机中安装好之后&#xff0c;防火墙已经关闭&#xff0c;ssh服务已经启动&#xff0c;但通过finalshell等ssh工具连接报错 &#xff1a;java.net.ConnectException: Connection timed out: connect 经过确认 防火墙已关&#xff0c;s…

visual sudio使用-创建空项目-创建cpp文件

新建空项目 新建cpp文件 #include <iostream> using namespace std;int main() {cout << "hello vs" << endl;cout << "hello c" << "\n";cout << "hello first day\n"; }

RS485 HUB接线方式介绍(RS485HUB、RS485分线器、RS485中继器、RS485集线器)(Modbus探测器)

文章目录 RS485 HUB接线方式介绍1. RS485网络基础1.1 RS485通信协议简介1.2 差分信号的优势 2. RS485 HUB的角色和功能2.1 HUB的定义和作用- **信号分配**&#xff1a;将来自主控制器的信号分配到多个设备。- **信号增强**&#xff1a;加强信号强度&#xff0c;确保信号在长距离…

常用的内外网文件传输方式及优缺点

在现代企业环境中&#xff0c;内外网文件传输是一项至关重要的任务。这涉及到数据的安全性、传输效率以及操作的便捷性等多个方面。 每种方式都有其独特的优缺点&#xff0c;下面我们将逐一进行分析。 1、FileLink 优势&#xff1a;FileLink是一款专用于企业内外网隔离后的文…

又3本!期刊On Hold 频发!涉及生物、计算机、工程技术等多个领域,请各位谨慎投稿!

【SciencePub学术】又3本&#xff01;On Hold 频发&#xff01;小编最近在查阅资料的过程中又发现3本期刊现在正在被On Hold中&#xff0c;涉及生物、计算机、工程技术等多个领域&#xff0c;请各位谨慎投稿&#xff01; 01 CELLULAR AND MOLECULAR BIOLOGY IF&#xff08;20…

flash attention的CUDA实现探讨-V3

之前关于flash attention的实现参考添加链接描述,添加链接描述,添加链接描述 lash attention的数学变换:给定三个矩阵Q,K,V,形状都是[N,d],计算S=QK.T,然后针对dim=1做softmax,然后和V继续做矩阵乘法得到形状为[N,d]的输出矩阵O,即O=softmax(QK.T,dim=1)V。 下面本人的…

Caddy2使用阿里云DNS申请https证书,利用阿里云DNS境内外不同解析给Gone文档做一个同域名的国内镜像站点

我从头到尾实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff1b;自己觉得还挺好用的&#xff0c;并且打算长期维护&#xff01; github地址&#xff1a;https://github.com/gone-io/gone 文档原地址&#xff1a;https:/…

图解HTTP(3、HTTP 报文内的 HTTP信息)

HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回客户端的响应。 HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端&#xff08;客户端&#xff09;的HTTP 报文叫做请求报文&#xff0c;响应端&#xff08;服务器端&#xff09;的叫做响应报文。 HT…

快速判断出485从站设备是否支持MODBUS RTU无线通讯

对于变频器和仪表设备&#xff0c;都支持485串口通讯&#xff0c;那么怎么判断从站设备支持那种协议呢&#xff1f;通常分为两种方式去判断&#xff1a;1.从设备参数参看2.从设备通讯报文查看。本次文章以以台达MH300系列变频器为例。 1.从设备通讯参数查看 使用设备之前一定…