前言
在学习Spring框架的IOC、AOP两大功能之前,首先需要了解这两个技术的基础——Bean。在Spring框架中,Bean无处不在,IOC容器管理的对象就是各种各样的Bean。理解Bean的生命周期有助于我们更好的理解和使用Spring框架的IOC功能,也有助于我们理解框架如何初始化、使用和管理Bean。接下来我们通过代码实现观察BeanFactory与ApplicationContext中bean的生命周期。
BeanFactory中Bean的生命周期
原理
BeanFactory在Spring框架中被称为IOC容器,是Spring框架的基础设施,面向Spring本身;Spring框架作者将其比作Spring的心脏,可见其在框架中的重要性。BeanFactory中bean的生命周期如图1所示。
其中橙色和绿色的是容器级别生命周期接口,也就是所有的Bean初始化时都会发生作用。主要包含两个接口InstantiationAwareBeanPostProcessor、BeanPostProcessor,一般被称为类后处理器。也可根据BeanName进行过滤对指定的Bean进行后处理。
蓝色的是Bean级生命周期接口方法,只有实现了这些接口的Bean进行初始化时,才会起作用。包含BeanNameAware、BeanFactoryAware、InitializingBean、DisposableBean。
灰色的是Bean自身的方法,通过Bean定义构造函数、setter属性赋值函数、init-method和destroy-method所指定的方法。
实例
参照《Spring 4.x企业应用开发实战》中的car创建验证Bean的生命周期。
- 首先定义CarBean类,实现Bean级别的各个接口,如下代码所示:
1 | public class CarBean implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean{ |
- 自定义容器级别工厂后处理器,代码如下:
1 | public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor { |
- 创建bean的xml文件,如下所示:
1 |
|
- 编写主程序验证bean生命周期
1 | public static void main(String[] args) { |
输出结果为:
1 | "E:\Program Files\Java\jdk1.8.0_91\bin\java" "-javaagent:D:\Program …… |
从上输出结果可验证Bean生命周期的流程。由于bean默认是单例模式,故在第二次调用getBean时,并没有触发生命周期初始化流程,而是从Spring缓存池中获取bean实例。若将bean的scope属性设置为prototype,则每次调用getBean都会创建一个新的Bean,生命周期方法会被再次调用。
ApplicationContext中的生命周期
在Spring容器ApplicationContext中,bean的生命周期与Bean中类似。区别是增加了BeanFactoryPostProcessor后处理器的postProcessBeanFactory方法以及ApplicationContextAware的setApplicationContext方法。Bean生命周期如下图所示:
修改xml配置文件,将自定义的MyBeanFactoryPostProcessor配置到xml文件里。修改后的xml文件如下所示:
1 |
|
MyBeanFactoryPostProcessor的类代码为:
1 | public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{ |
调用ApplicationContext的getBean生成Bean,输出结果为:
1 | "E:\Program Files\Java\jdk1.8.0_91\bin\java" "-javaagent:D:\Program ……org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myBeanFactoryPostProcessor' |