Spring之bean的生命周期

spring bean的生命周期

bean的生命周期有三个大的阶段:产生,使用,销毁

产生:

**启动:**准备容器/环境等

为了了解bean的需求,通过加载bean定义方法loadBeanDefinition方法用xml文件,注解扫描等方法找到所有的被定义的bean类,并且放在容器中一个定义bean集合中,即beanDefinitionMap

然后遍历这个集合,通过createBean方法创建bean对象

创建bean大体分为:构建对象 填充属性 初始化实例 注册销毁

构建对象 :通过createBeanInstance方法进行bean对象的构造,先用反射机制从"bean定义"的BeanClass找到这个类的构造方法,如果这个bean只有一个构造方法,那么只能使用这个构造方法无论有没有入参;当bean中有多个构造方法时,会先使用带有@Autowired注解的构造方法;如果多个构造方法都有@Autowired注解则会报错;如果构造方法都没有@Autowired注解则会优先拿无入参的构造方法;如果多个构造方法都是由入参的无法判断则会报错。所以不建议在任何bean中添加多个构造方法

确定了构造方法后就要准备这个构造方法需要的参数了,在单例池中,根据参数的class类进行查找,如果这个类在容器中有多个实例则会根据参数名进行匹配,如果没有找到则认为参数信息不完整报错

在参数准备好后就可以通过反射进行bean的构造了,也就是实例化,当然如果选择的是无参构造则无需参数准备直接构造

填充属性:通过populateBean方法对bean内部的属性进行赋值填充,通常就是@Autowired注解的这些变量,通过三级缓存机制进行填充,也就是依赖注入


**初始化实例:**在属性填充后,通过initializeBean方法对实例初始化

初始化的第一步是初始化相关容器的信息,通过invokeAwareMethods方法为实现了各种Aware接口的 Bean设置诸如beanName,beanFactory等容器信息,Aware接口代表信息感知接口,一旦实现了这些接口就可以在bean实例中感知并获取到对应的信息

之后通过invokeInitMethods方法执行bean的初始化方法,在执行初始化方法的前后都会处理各种bean的后置处理器,这些处理器包括负责处理AOP的AnnotationAwareAspectJAutoProxyCreator;负责构造后@Post

Construct和销毁前@PreDestory处理的InitDestoryAnnotationBeanPostProcessor等系统级处理器以及各种自定义bean处理器


注册销毁:为了实现bean优雅的销毁,通过注册销毁registerDisposableBean方法将实现了接口DisposableBean的bean进行注册,这样在销毁时就可以执行destory()方法了

通过以上四步我们就将bean创建好了,最后只需要将这些完整的bean对象通过addSingleton方法放入单例池singletonObjects中就可以被获取和使用了

销毁:

在销毁前要先执行"销毁前处理器"postProcessBeforeDestruction,这里就会执行bean中的@preDestory注解的方法,

然后通过destroyBeans方法逐一销毁我体内所有的bean,销毁时会执行destroy方法

在destroy方法 执行之后,还通过"客户端销毁方法"invokeCustomDestroyMethod 来执行在bean上自定义的destroyMethod方法

这样就有一套完整的bean生产到使用到销毁的流程的完整的生命周期

本文笔记来与B站:https://www.bilibili.com/video/BV1e14y1A7pT/?spm_id_from=pageDriver\&vd_source=f9af4c399ac09334b0db3cfc9fc316e3

相关推荐
Nuanyt15 分钟前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode
cfm_29142 小时前
Leaf-segment号段模式
java
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 发布圈子动态:数据库表和接口文档介绍
java·数据库·交友
paopaokaka_luck2 小时前
智慧电玩店管理系统(空闲机台随机分配、游玩时长概率模拟、积分自动结算、积分兑换闭环、 ECharts经营分析、 腾讯地图选址)
java·人工智能·mysql·echarts·推荐算法
LMT流氓兔2 小时前
第五单元——第9课:防止同一次操作重复执行
java·服务器·数据库·算法·ai·langchain
OxYGC2 小时前
Spring 面经系列 · 第 6 篇:Spring MVC 请求全流程、父子容器与零配置原理
java·spring·mvc
code2cat2 小时前
Java高级篇之JDBC:连接数据库,完成查询、更新与事务
java·开发语言·数据库
bksczm2 小时前
Redis数据结构之string
java·redis·mybatis
cc_瀚海知行2 小时前
资料检索 1|直接放入全文、按需读文件和先检索,有什么区别?
java·人工智能·ai
BioRunYiXue3 小时前
使用docker分析高通量测序数据
java·数据库·人工智能·spring cloud·docker·tomcat·html