Spring Bean生命周期

简单说说IoC和Bean


IoC,控制反转,想必大家都知道,所谓的​控制反转​,就是把new对象的权利交给容器,所有的对象都被容器控制,这就叫所谓的控制反转。

 

 

Bean,也不是什么新鲜玩意儿,它们就是一帮身不由己的Java对象,生命周期受到容器控制。

 

Bean生命周期和人生

Bean生命周期四大阶段

我们知道,bean的作用域有好几种,这篇文章只讨论完全被IoC容器控制的单例Bean。

对于普通的Java对象来说,它们的生命周期就是:

实例化
对象不再被使用时通过垃圾回收机制进行回收

这就像是生活在大自然里的动物,悄然出生,悄然死亡。

而对于Spring Bean的生命周期来说,可以分为四个阶段,其中初始化完成之后,就代表这个Bean可以使用了:

实例化 Instantiation  英 / ɪnstænʃɪˈeɪʃən /
属性赋值 Populate    英 / ˈpɒpjuleɪt /
初始化 Initialization 英/ ɪˌnɪʃəlaɪˈzeɪʃn /

销毁 Destruction / dɪˈstrʌkʃ(ə)n /

 

人和动物不一样,存在非常复杂的社会。

 

我们来看看社会里的人,一生要经历哪些阶段,是不是和Bean的生命周期很像呢?


出生:作为一个自然人降临在这个世界
登记:登记身份证号,姓名,正式成为人类社会的一份子
成长:接受教育,成为对社会有用的人
工作:为社会创造价值
死亡:人死如灯灭,不过人这盏灯灭了,还要把灯台埋起来

 

 

Bean实例化的时机也分为两种,BeanFactory管理的Bean在使用到Bean的时候才会实例化Bean,ApplicantContext管理的Bean容器初始化的时候就回完成Bean实例化。

BeanFactory就是相对不那么健全的原始一些的社会,ApplicantContext是发达健全的现代社会

 

 

Bean详细生命周期

我们讲到了Bean容器四个阶段,会有一些容器级的方法,进行前置和后置的处理,比如  InstantiationAwareBeanPostProcessor、BeanPostProcessor接口方法。这些方法独立于Bean之外,并且会注册到Spring容器中,在Spring容器创建Bean的时候,进行一些处理。

 

 

这就好像,孩子出生之前,需要做一些准备,比如备孕、养胎、备产什么的,出生之后,需要做一些护理。孩子上学前后,也需要做一些学籍的管理。

那么有了各种各样的扩展之后,我们再接着看看Bean的详细的生命周期。首先,我们面临一个问题——Bean的生命周期从什么时候开始的呢?

上面写了,Bean实例化前后,可以进行一些处理,但是如果从Bean实例化前算开始,那么就要追溯到容器的初始化、beanDefiinition的加载开始。英 / ˌdefɪˈnɪʃ(ə)n /

所以这篇文章里,我们取生命周期直接从Bean实例化开始,但是大家也要知道,Bean实例化前后,可以使用后处理器进行处理,例如BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor。

大家也不要困扰,就像计算人生的起点,是从母亲怀孕算起,还是从孩子出生算起?我们这里取了出生开始而已。

 

 

​实例化​:第 1 步,实例化一个 Bean 对象
​属性赋值​:第 2 步,为 Bean 设置相关属性和依赖
​初始化​:初始化的阶段的步骤比较多,5、6步是真正的初始化,第 3、4 步为在初始化前执行,第 7 步在初始化后执行,初始化完成之后,Bean就可以被使用了
​销毁​:第 8~10步,第8步其实也可以算到销毁阶段,但不是真正意义上的销毁,而是先在使用前注册了销毁的相关调用接口,为了后面第9、10步真正销毁 Bean 时再执行相应的方法

我们发现Bean生命周期的详细过程,是不是也像人生的历程,出生、登记,不过是很短的事情。慢慢长大成人,要经历人生的四分之一,而成长,来源于教育,不管是学校的还是社会的,接受教育前,要登记学籍,上学的时候,自己还要努力……,到最后,要发一纸薄薄的文凭,标志着我们成为可以捶打的“社会人”。

然后,为社会奉献四十年。最后老去,离世。不过Bean的世界,没有退休——当然,也许,人的世界也没有退休。

 

 

我们发现中间的一些扩展过程也可以分四类:

 

posted @ 2022-11-22 14:40  しゅおく  阅读(1)  评论(0)    收藏  举报