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()方法。
大致过程是:
属性类型不需要强制转换时,不需要解析属性值,直接进行依赖注入
属性值类型需要进行强制转换时,如对其他对象的引用等,首先需要解析属性值,然后对解析后的属性值进行依赖注入
我们进入resolveValueIfNecessary()方法,可以看见这里面有对不同类型属性的解析,感兴趣自己点进去看看。
我们进入setPropertyValues()这个方法,到AbstractPropertyAccessor这个类中,我们会发现很多setPropertyValues的重载方法。但是都会走到**setPropertyValue()**这个方法中。
我们继续跟进,还是会发现有很多的setPropertyValue()方法的重载,我靠,怎么这么多!但最后还是会回到这几个方法。这时候,我们属性的依赖注入终于要进行了。我们可以看见主要有3类,对数组类型、对List类型和对Map类型的注入
到此,我们的属性填充终于终于终于完成了,重载的方法是真的多!
接下来,我们进入初始化方法(initializeBean())中。
在这个里面,我们可以看见上面画的流程图中的大部分方法了。Aware接口、BeanPostProcess和init-method
Aware接口上面已经贴出来了,就不展示了。
applyBeanPostProcessorsBeforeInitialization()方法
invokeInitMethods()方法
applyBeanPostProcessorsAfterInitialization()方法
终于要到销毁方法了,在refresh()中的destroyBeans()方法。
我们点进去,会调用当前BeanFactory的destroySingletons()方法
调用父类的destroySingletons()方法
到此,我们整个Bean的生命周期就结束了。
Spring中Bean的生命周期