bean的生命周期指的是从对象创建到对象销毁的过程。
一、生命周期阶段
(一)生命周期流程图
(一)实例化bean
- 调用bean的无参构造函数实例化bean对象
(二)属性赋值
- 为bean的属性赋值和对其它bean进行引用(调用bean的set方法)
(三)初始化bean
- 检查Aware的相关接口并设置相关依赖;
- 是否自定义类实现BeanPostProcessor接口,如果有则调用前置处理方法postProcessBeforeInitialization;
- 判断是否实现InitializingBean接口,如果实现此接口,Spring将调用他们的afterPropertiesSet()方法;
- 判断是否配置自定义的inint-method方法;
- 调用BeanPostProcessor后置处理方法postProcessAfterInitialization方法;
- 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
(四)容器关闭销毁bean
- 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
二、相关扩展点
(一)Aware 接口
若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源。
Spring 中提供的 Aware 接口有:
- BeanNameAware:注入当前 bean 对应 beanName;
- BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader;
- BeanFactoryAware:注入 当前BeanFactory容器 的引用。
源代码如下所示:
// AbstractAutowireCapableBeanFactory.javaprivatevoidinvokeAwareMethods(finalStringbeanName, finalObjectbean) { if (beaninstanceofAware) { if (beaninstanceofBeanNameAware) { ((BeanNameAware) bean).setBeanName(beanName); } if (beaninstanceofBeanClassLoaderAware) { ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl); } if (beaninstanceofBeanFactoryAware) { ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this); } } }
(二)BeanPostProcessor
BeanPostProcessor 是 Spring 为修改 bean提供的强大扩展点,其可作用于容器中所有 bean,其定义如下:
publicinterfaceBeanPostProcessor { // 初始化前置处理defaultObjectpostProcessBeforeInitialization(Objectbean, StringbeanName) throwsBeansException { returnbean; } // 初始化后置处理defaultObjectpostProcessAfterInitialization(Objectbean, StringbeanName) throwsBeansException { returnbean; } }
(三)InitializingBean 和 init-method
InitializingBean 和 init-method 是 Spring 为bean 初始化提供的扩展点。
InitializingBean接口 的定义如下:
publicinterfaceInitializingBean { voidafterPropertiesSet() throwsException; }
init-method需要通过配置文件或注解指定初始化方法
三、总结
最后总结下如何记忆 Spring Bean 的生命周期:
- 首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;
- 再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
- 销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。