【Spring】Spring中Bean的生命周期

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的生命周期就结束了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值