Spring中Bean的生命周期

Bean是什么?

本来没有这一节的,但是写完源码之后,在想是否能够类比一下别的更具体的东西,然后想着想着突然想到了个Bean到底是什么?好像用了这么久的Spring,都还没想过这个问题。然后就去看看官网、书、博客等。就有了这一节。

官网的解释:

《Spring5核心原理与30个类手写实战》中的解释:
Bean对于Spring的意义就像Object对于OOP的意义一样。Spring在Java组件化(JavaBean、EJB等)开发理念下出现的。

个人理解
Bean是一个组件(对象),组成了我们的应用程序,通过IoC可以对其进行管理。就好比去吃自助餐里面的一道道菜。



生命周期

源码中的描述


大致过程



源码分析

上图中的核心方法几乎都在doCreateBean()中,我们直接进入到AbstractAutowireCapableBeanFactory类中。


首先,进入bean实例的创建,createBeanInstance()方法。


我们可以看见上图中Bean可以通过instantiateUsingFactoryMethod()方法创建,也可以通过autowireConstructor()方法创建,但是默认的是使用instantiateBean()方法创建。我们点进去看看


我们可以看到这里面有JDK的安全API以及对获取到的bean实例对象进行封装,最重要的是getInstantiationStrategy().instantiate();这个方法。我们继续点进去。

是不是看见了个很熟悉的方法?clazz.getDeclaredConstructor();获取构造方法。是不是接下来就会想到了对应的newInstance()?这其实就是在BeanUtils.instantiateClass(constructorToUse);调用了。到此,Bean的实例化出来了,后续就是我们上面说的对Bean实例的封装BeanWrapper了。


接下来,我们进入bean实例对象的属性填充(populateBean()方法)。


重要的是applyPropertyValues()这个方法,我们点进去看看。

其中最重要的两个方法是:解析resolveValueIfNecessary()和注入setPropertyValues()方法。

大致过程是:

  1. 属性类型不需要强制转换时,不需要解析属性值,直接进行依赖注入

  2. 属性值类型需要进行强制转换时,如对其他对象的引用等,首先需要解析属性值,然后对解析后的属性值进行依赖注入


我们进入resolveValueIfNecessary()方法,可以看见这里面有对不同类型属性的解析,感兴趣自己点进去看看。


我们进入setPropertyValues()这个方法,到AbstractPropertyAccessor这个类中,我们会发现很多setPropertyValues的重载方法。但是都会走到**setPropertyValue()**这个方法中。


我们继续跟进,还是会发现有很多的setPropertyValue()方法的重载,我靠,怎么这么多!但最后还是会回到这几个方法。这时候,我们属性的依赖注入终于要进行了。我们可以看见主要有3类,对数组类型、对List类型和对Map类型的注入


到此,我们的属性填充终于终于终于完成了,重载的方法是真的多!

接下来,我们进入初始化方法(initializeBean())中。

在这个里面,我们可以看见上面画的流程图中的大部分方法了。Aware接口、BeanPostProcess和init-method


Aware接口上面已经贴出来了,就不展示了。

applyBeanPostProcessorsBeforeInitialization()方法


invokeInitMethods()方法


applyBeanPostProcessorsAfterInitialization()方法


终于要到销毁方法了,在refresh()中的destroyBeans()方法。

我们点进去,会调用当前BeanFactory的destroySingletons()方法


调用父类的destroySingletons()方法

到此,我们整个Bean的生命周期就结束了。

作者

zhaommmmomo

发布于

2021-04-24

更新于

2023-06-27

许可协议