Bean的生命周期与循环依赖

news2024/11/28 11:51:03

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

Bean生命周期

扫描类 得到 BeanDefinition(包含bean的class等属性值)  
后在BeanFactoryPostProcessor对bean实例化之前对Bean的元数据进行操作,修改Bean的属性值、添加自定义的BeanDefinition
实例化非懒加载单例bean
  1. 实例化
  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.coloradmin.cn/o/1670774.html

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

相关文章

Android 系统省电软件分析

1、硬件耗电 主要有&#xff1a; 1、屏幕 2、CPU 3、WLAN 4、感应器 5、GPS(目前我们没有) 电量其实是目前手持设备最宝贵的资源之一&#xff0c;大多数设备都需要不断的充电来维持继续使用。不幸的是&#xff0c;对于开发者来说&#xff0c;电量优化是他们最后才会考虑的的事情…

【Linux】自动化构建工具make/Makefile和git介绍

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…

如何把root账号的文件修改为tank账号

linux系统 以当前用户命令创建的目录都是root的用户并且是只读的&#xff1a; 用优盘拷贝的文件及文件夹的权限是&#xff1a; 解决方案是&#xff1a;把root账号的文件修改为tank账号 在Linux系统中&#xff0c;如果您需要将属于root用户的文件或目录的所有权更改到另一个用…

【数据库】docker搭建mysql8一主两从节点,配置proxysql读写分离

docker搭建mysql8一主两从节点&#xff0c;配置proxysql读写分离 一、docker 搭建 mysql8 一主两从节点1.1 相关配置文件与docker启动1.2 半同步复制1.3 主从同步异常处理 二、mysql 中间件 ProxySql 配置读写分离2.1 在mysql服务里创建给proxySQL访问的用户2.2 安装ProxySql及…

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能 安装配置 首先确保已经安装如下程序&#xff1a; flask&#xff1a;用于构建web应用程序。flask-sqlalchemy&#xff1a;用于在 Flask 中连接 MySQL 数据库&#xff0c;通过pip install flask-sqlalchemy安装。pym…

2024第二届智慧教育和人类发展国际会议(ICSEHD2024)

2024第二届智慧教育和人类发展国际会议(ICSEHD2024) 会议简介 智慧教育对于提升教育质量、促进教育公平、推动教育现代化和数字化转型、培养创新人才以及推动教育理论的发展都具有重要的意义&#xff0c;对人类发展产生着深远的影响&#xff0c;人类发展是智慧教育的最终目的…

Weblogic 任意文件上传漏洞(CVE-2018-2894)

1 漏洞描述 CVE-2018-2894漏洞存在于Oracle WebLogic Server的Web服务测试页面&#xff08;Web Service Test Page&#xff09;中。这个页面允许用户测试Web服务的功能&#xff0c;但在某些版本中&#xff0c;它包含了一个未经授权的文件上传功能。攻击者可以利用这个漏洞&…

uni-app跨端兼容

1.样式兼容 小程序端不支持*选择器&#xff0c;可以使用&#xff08;view,text&#xff09; 页面视口差异(tabar页、普通页) H5端默认开始scoped 例如骨架屏样式出现问题&#xff0c;需要将之前的样式拷贝到骨架屏中 提示&#xff1a;H5端是单页面应用&#xff0c;scoped隔离…

实训八:使用jQuery技术实现企业信息展示系统的相关功能

实训八:使用jQuery技术实现企业信息展示系统的相关功能 1.题目 使用jQuery技术实现企业信息展示系统的相关功能。 2.目的 (1)掌握jQuery的基本知识。 (2)掌握jQuery的应用方法。 (3)进一步理解Ajax程序的设计方法。 (4)会利用所学知识设计简单的应用程序。 3.内容 用jQuery技术…

轴承制造企业“数智化”突破口

轴承是当代机械设备中一种重要零部件。它的主要功能是支撑机械旋转体&#xff0c;降低其运动过程中的摩擦系数&#xff0c;并保证其回转精度。轴承是工业核心基础零部件&#xff0c;对国民经济发展和国防建设起着重要的支撑作用。 轴承企业普遍采用以销定产的经营模式&#xf…

基于TRIZ理论为可穿戴设备创造更好的用户体验

从智能手表到健康监测器&#xff0c;这些小巧而强大的设备正逐渐改变着我们的生活方式。然而&#xff0c;用户体验的优劣直接影响着可穿戴设备的市场接受度和用户黏性。在这样的背景下&#xff0c;基于TRIZ理论&#xff08;发明问题解决理论&#xff09;的创新思维和方法论&…

抖音直播视频怎么录屏

要录制手机直播视频&#xff0c;您需要按照以下步骤进行操作&#xff1a; 1. 打开录屏软件&#xff1a;首先&#xff0c;在您的手机中打开您已经安装好的录屏软件。不同的录屏软件设置方式不同&#xff0c;请根据实际情况进行操作。 2. 调整设置&#xff1a;根据录屏软件的使用…

【深度学习】实验3 特征处理

特征处理 python 版本 3.7 scikit-learn 版本 1.0.2 1.标准化 from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler from matplotlib import gridspec import numpy as np import matplotlib.pyplot as plt cps np.random.…

【生信技能树】拿到表达矩阵之后,如何使用ggplot2绘图系统绘制箱线图?

拿到表达矩阵之后&#xff0c;如何使用ggplot2绘图系统绘制箱线图&#xff1f; 目录 预备知识 绘制箱线图示例 预备知识 1.pivot_longer函数 pivot_longer 是tidyr包中的一个函数&#xff0c;用于将数据框&#xff08;data frame&#xff09;从宽格式转换为长格式。在宽格…

AI游戏外挂为何违法?

尊敬的读者们&#xff0c;大家好&#xff01;今天我想和大家探讨一个备受争议的话题——AI游戏外挂的合法性。近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI外挂逐渐成为游戏领域的一大毒瘤。那么&#xff0c;为什么AI游戏外挂会被视为违法行为呢&#xff1f;本…

inline和static底层浅析

找一段代码来底层分析 #include<iostream> using namespace std;inline int add(int a, int b) {return a + b

【Java】入门

笔者是在C语言基础上学习java 安装Java的过程中我们可能会见到这样几个东西&#xff0c;JVM、JRE、JDK&#xff0c;那它们的关系是怎样的呢&#xff1f; -JVM Java Virtual Machine 是Java虚拟机&#xff0c;Java程序需要运行在虚拟机上&#xff0c;不同的平台有自己的虚拟机…

Hack The Box-SolarLab

总体思路 SMB获取敏感信息->CVE-2023-33733漏洞注入->CVE-2023-32315->敏感信息泄露 信息收集&端口利用 nmap -sSVC -p1-10000 10.10.11.16发现目标开放了80、135、139、445和6791端口&#xff0c;并且对应的端口也给出了重定向的标志&#xff0c;将域名加入到…

MySQL学习3

目录 一.合计/统计函数&#xff1a; 1.合计函数--count&#xff1a; 2.合计函数-sum 3.合计函数-avg 4.合计函数--max/min 二.分组统计&#xff1a; &#xff08;1&#xff09;使用group by子句对列进行分组&#xff1a; &#xff08;2&#xff09;使用having子句对分组…

Linux下Telemac-Mascaret源码编译安装及使用

目录 软件介绍 基本依赖 其它可选依赖 一、源码下载 二、解压缩 三、编译安装 3.1 修改环境变量设置文件 3.2 修改配置文件 3.3 编译安装 四、算例运行 软件介绍 TELEMAC-MASCARET是法国电力集团(EDF)的法国国立水利与环境实验室开发的一款研究水动力学和水文学领域的…