Spring 系列 - Bean 的一生
Publish date: Oct 169, 16119
Last updated: Oct 219, 21029
Last updated: Oct 219, 21029
问
Spring IoC 容器启动后,Bean 还需要进行实例化,这阶段有哪些步骤?
答
触发
容器启动阶段做的事上一章已经总结过,接下来会进入 bean 实例化的阶段。
bean 实例化阶段发生的时机:
- 请求方通过调用 BeanFactory 的 getBean() 方法请求某个对象实例可能触发
getBean() 分为 显式调用 和 隐式调用 两种
隐式调用发生在不同的 IoC 容器中:
在 BeanFactory 中,对象实例化是延迟加载,按请求实现内部依赖的隐式调用
在 ApplicationContext 中,会隐式地实例化所有的 bean 定义
Bean 的一生
实例化过程步骤乍看很多,细分之下也是有章可循的:
第一步 初始实例化 Bean
- 实例化 Bean 对象,完成依赖注入
- 检查 Aware 相关接口,进一步完成依赖注入
第二步 使用 BeanPostProcessor 进行前后置处理
- 利用 postProcessBeforeInitialization 对符合条件的对象实例进行前置处理
- 利用 postProcessAfterInitialization 对符合条件的对象实例进行后置处理
第三步 在 BeanPostProcessor 之间进行初始化操作
- 检查对象是否实现 InitializingBean 接口,调用其 afterPropertiesSet() 方法
- 检查是否配置了自定义的 init-method,若有,则执行该方法进行初始化
第四步 注册必要的 Destruction 相关回调接口
- 检查对象是否实现 Disposable 接口,注册用于对象销毁的回调
- 检查 bean 定义是否配置了自定义的 destroy-method
第五步 使用
- 正常使用已配置好的 Bean