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

相关推荐
s:1031 小时前
【框架】参考 Spring Security 安全框架设计出,轻量化高可扩展的身份认证与授权架构
java·开发语言
南山十一少4 小时前
Spring Security+JWT+Redis实现项目级前后端分离认证授权
java·spring·bootstrap
427724006 小时前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo6 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦6 小时前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个6 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
Tirzano6 小时前
springsecurity自定义认证
spring boot·spring
南宫生9 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长9 小时前
Maven 基础环境搭建与配置(一)
java·maven
逸狼10 小时前
【JavaEE进阶】Spring MVC(3)
spring·java-ee·mvc