【视频笔记】史上最完整的Spring Bean的生命周期

介绍5.x版本的spring,体内最核心的运行原理之一,IOC中bean的生命周期。

妥善管理和使用这些bean,bean会经历三个大的阶段:产生、使用、消耗,其中产生最为复杂

 为了精准的了解对bean的要求,通过“加载bean定义” loadBeanDefinitions方法,用xml,注解扫描等各种方式,将定义的bean类一个个都找到

 并且放在spring容器中的一个“Bean定义”集合中 (即BeanDefinitionMap),就可以遍历这个集合,通过spring的createBean方法,创建一个个Bean对象拉

创建Bean大体分为“构造对象,填充属性,初始化实例,注册销毁”四个步骤

2.1 构造对象 

spring通过createBeanInstance方法进行对象的构造,先用反射机制先从“Bean定义”中的BeanClass拿到这个类的构造方法。

当然,在拿取构造方法时,是有一些规则的:如果这个ean只有一个构造方法,那毫无疑问只能拿它(无论这个构造方法有没有入参);

当Bean中有多个构造方法时,spring会先拿到有@Autowired注解的构造方法,当有多个构造方法都加了@Autowired注解,spring没有办法判断到底用哪个方法进行构造,所以只能报错了

如果构造方法都没有@Autowired注解,spring就会优先拿无参的构造方法;

如果多个构造方法都是有入参的,spring没有办法判断具体拿哪个,所以又要报错了

 

 这里不建议,在任何Bean中添加多个构造方法,这样可读性低,理解和维护会很困难

 

在确定了构造方法之后,就要准备这个构造方法需要的参数了,spring会在单例池中,根据参数的Class类进行查找

 如果这个类在spring中有多个实例,则会根据参数名再进行匹配

 如果没有找到,spring就会认为构造信息不完整,而直接报错

 

在参数准备好之后,通过反射就可以进行Bean的构造了,也就是常说的实例化。

当然如果选择的是无参构造方法,则无需参数直接构造。

 

2.2 填充属性,在Bean对象构造成功后,接下来就进行属性填充了,spring通过populateBean方法为Bean内部的所需属性进行赋值填充

 通常就是@Autowired注解的这些变量

 spring通过“三级缓存”机制进行填充,也就是所谓的依赖注入

2.3 初始化实例 

在Bean填充后,紧接着就要通过initializeBean方法,对这个实例进行初始化了。初始化的第一步是初始化容器相关信息,通过invokeAwareMethod方法,为实现了各种Aware接口的Bean设置诸如beanName、beanFactory等容器信息

 spring的Aware接口代表“信息感知”接口,一旦实现了这些接口,就可以在Bean实例中感知并获取到对应的信息

接下来就需要通过InvokeInitMethod方法执行Bean的初始化方法拉。 这个方法是通过实现InitializlingBean接口而实现的afterProperetiesSet方法

 方法名很直接,表示“Bean填充属性后”执行,在afterPropertiesSet执行后,还会继续执行用户在Bean上自定义的initMethod方法

  

 

 在执行初始化方法之前和之后,还需要对“Bean后置处理器”BeanPostProcessors进行处理,

spring通过applyBeanPostProcessorsBeforeInitialization、applyBeanPostProcessorsAfterInitialization分别在初始化之前和之后,处理各种Bean的后置处理器

这些处理器包括spring自身提供的“负责AOP处理的”AnnotationAwareAspectJAutoProxyCreator、负责“构造后@PostConstruct和销毁前@PreDestory处理”的

InitDestroyAnnotationBeanPostProcessor等“系统级”处理器

 以及用户通过实现BeanPostProcessor接口的“自定义”处理器

 这些接口有很多,可以通过实现PriorityOrdered接口来指定顺序,进行逐一处理

 

2.4 注册销毁

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

通过以上4小步,我们就将bean创建好了。

 

 

 

3、addSingleton

只需要将这些完整的Bean对象通过addSingleton方法,放入单例池singletonObjects中就可以被获取和使用拉。

 

这样“产生Bean”就全部完成拉,用户就可以在spring内“使用”这些bean拉。

 

最后,当spring执行close关闭的时候,和“产生Bean”类似,在销毁之前要3.1、先执行“销毁前处理器” postProcessBeforeDestruction,这里就会执行Bean中@PreDestory注解的方法

 

 3.2、然后通过destoryBeans方法逐一“销毁”spring体内所有的Bean,销毁时会执行刚提到的destroy方法,

 

 

在destroy执行之后, 也会通过“客户销毁方法” invokeCustomDestroyMethod来执行用户在Bean上自定义的destroyMethod方法

 

 这样,从bean的生产、使用到销毁这一套完整的生命周期就介绍完拉

 

posted @ 2025-06-11 11:59  fanblog  阅读(52)  评论(0)    收藏  举报