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

一、接口分类:

在以上接口方法中, 可以分为几类:
1、容器级生命周期接口方法【灰色底色】: BeanFactoryPostProcessor、BeanPostProcessor和InstantiationAwareBeanPostProcessor。它们都是容器初始化bean时对外暴露的扩展点(容器扩展点),一般称它们的实现类为“后置处理器”。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声明了销毁方法,该方法也会被调用。

大家可以自己写一个类,然后实现各个bean级接口,在每个实现方法中输出一句。然后实现容器级接口,再到配置文件中注册,最后运行程序查看各个接口方法执行顺序。
对于一些关键的容器级扩展点和bean接口,后面会专门谈到。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐