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

相关推荐
小灰灰要减肥20 分钟前
装饰者模式
java
张铁铁是个小胖子32 分钟前
MyBatis学习
java·学习·mybatis
Yan.love1 小时前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶1 小时前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥1 小时前
java提高正则处理效率
java·开发语言
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101342 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob3 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13143 小时前
常用的缓存技术都有哪些
java