Spring Bean——理解Bean的生命周期

生命周期图

在bean准备就绪给我们使用之前,容器默默的执行了很多启动步骤。Spring提供了BeanFactory作为Spring容器,平常开发中我们常用其派生类ApplicationContext。
尽管BeanFactory和ApplicationContext容器的注册方式不大一样(使用BeanFactory要显示的调用其addBeanPostProcessor()方法进行注册)以及加载bean的时机不一样(BeanFactory默认采用延迟加载)等,但对于bean的生命周期管控基本一致。
这里就以ApplicationContext来说。
Bean的完整生命周期可以认为是从容器创建初始化Bean开始,直到Spring容器关闭。
事实上,在Bean被初始化创建之前,容器级别的接口方法也会对Bean产生影响,因此这里把这两个事件也加进来了。
在这里插入图片描述

一、接口分类:

在以上接口方法中, 可以分为几类:

1、容器级生命周期接口方法【灰色底色】:
BeanFactoryPostProcessor、BeanPostProcessor和InstantiationAwareBeanPostProcessor。它们都是容器初始化bean时对外暴露的扩展点(容器扩展点),一般称它们的实现类为“后置处理器”。(需要将实现这些接口的bean注册到spring容器中。)然后InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,可以在Bean生命周期的另外三个时期提供扩展的回调接口,即实例化Bean之前(调用postProcessBeforeInstantiation方法)、给bean注入对应属性后(调用postProcessPropertyValues方法)和实例化Bean之后(调用postProcessAfterInstantiation方法)。

2、Bean级生命周期接口方法【浅蓝色底色】:
BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean。需要bean继承接口然后在bean内部实现方法,因此属于Bean级生命周期接口方法。

3、Bean自身的调用方法【浅红色底色】:
通过配置文件中的init-method和destroy-method指定的方法。

二、流程简述

1、[容器级]BeanFactoryPostProcessor接口:如果spring配置文件注册了该接口的实现类,可以在spring的bean创建之前,修改bean的定义属性。例如可以把bean的scope从singleton改为prototype。

2、[容器级]InstantiationAwareBeanPostProcessor接口:初始化Bean之前的预处理;

3、初始化Bean

4、[容器级]InstantiationAwareBeanPostProcessor接口:如果spring配置文件注册了该接口的实现类,Spring将调用它们的postProcessPropertyValues方法;

5、注入:Spring根据定义信息(beanDifinition)将值和引用bean注入到bean对应的属性中;

6、[Bean级]感知类名:如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;

7、[Bean级]感知容器:如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来。(实用)
注:BeanFactory容器查找实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入.

8、[容器级]BeanPostProcessor: 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;

9、[Bean级]InitializingBean:如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。

10、[Bean自身方法]init-method:如果bean定义中使用指定了init-method初始化方法,该方法也会被调用;

11、[容器级]BeanPostProcessor:如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;

12、[容器级/后处理器]InstantiationAwareBeanPostProcessor :如果bean实现了InstantiationAwareBeanPostProcessor 接口,Spring将调用它们的postProcessAfterInitialization()方法;
此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;

13、[Bean级]DisposableBean:如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。

14、[Bean自身方法]destroy-method: 如果bean定义中使用destroy-method声明了销毁方法,该方法也会被调用。

猜你喜欢

转载自blog.csdn.net/m0_37556444/article/details/83110451