Spring之bean的生命周期

2023-12-15 04:46:36

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

文章来源:https://blog.csdn.net/qq_62592925/article/details/135007014
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。