Spring源码之九——finishRefresh方法详解
2023-10-11 14:31:47
Spring IoC 的 finishRefresh 方法:将 IOC 容器变为可用状态
简介
在 Spring IoC 容器的初始化过程中,finishRefresh 方法扮演着至关重要的角色,它将容器从初始化状态转变为已注册状态,即真正的可用状态。
finishRefresh 方法的意义
finishRefresh 方法的作用是触发一系列操作,让 Spring IoC 容器做好为应用程序提供服务的准备。这些操作包括:
- 为所有非懒加载的单例 Bean 创建实例
- 调用所有 FactoryBean 的 afterPropertiesSet 回调函数
- 调用所有 AutowireCapableBeanFactory 的 postProcessBeanFactory 方法
- 调用所有 Bean 的 afterPropertiesSet 方法
- 调用所有 Bean 的 init-method
- 发布 ContextRefreshedEvent 事件
finishRefresh 方法的流程
finishRefresh 方法的流程如下:
- 检查 Bean 定义是否为懒加载,如果不是,则创建 Bean 实例
- 调用所有 FactoryBean 的 afterPropertiesSet 回调函数
- 调用所有 AutowireCapableBeanFactory 的 postProcessBeanFactory 方法
- 调用所有 Bean 的 afterPropertiesSet 方法
- 调用所有 Bean 的 init-method
- 发布 ContextRefreshedEvent 事件
示例
以下是一个 finishRefresh 方法的代码示例:
public void finishRefresh() {
// 为非懒加载的单例 Bean 创建实例
finishBeanFactoryInitialization(getBeanFactory());
// 调用所有 FactoryBean 的 afterPropertiesSet 回调函数
finishSingletonBeanInitialization();
// 调用所有 AutowireCapableBeanFactory 的 postProcessBeanFactory 方法
finishBeanFactoryPostProcessing();
// 调用所有 Bean 的 afterPropertiesSet 方法
finishApplicationContextInitialization();
// 调用所有 Bean 的 init-method
finishApplicationContextEarlyStartup();
// 发布 ContextRefreshedEvent 事件
finishApplicationContextStartup();
}
总结
finishRefresh 方法是 Spring IoC 容器初始化的最后一个方法,它将容器从初始化状态转变为已注册状态,即真正的可用状态。通过完成一系列操作,finishRefresh 方法为应用程序提供了必要的支持,使 Bean 能够被实例化和使用。
常见问题解答
-
为什么 finishRefresh 方法对于 Spring IoC 容器至关重要?
finishRefresh 方法将容器从初始化状态转变为已注册状态,使容器能够为应用程序提供 Bean。 -
finishRefresh 方法调用了哪些回调函数?
finishRefresh 方法调用了 FactoryBean 的 afterPropertiesSet 回调函数、AutowireCapableBeanFactory 的 postProcessBeanFactory 方法以及 Bean 自己的 afterPropertiesSet 方法。 -
为什么需要为非懒加载的单例 Bean 创建实例?
为了确保这些 Bean 在调用 getBean 方法时能够立即获取。 -
finishRefresh 方法如何使 Bean 能够被使用?
通过实例化 Bean、调用回调函数和执行 init-method,finishRefresh 方法使 Bean 能够被应用程序使用。 -
完成 finishRefresh 方法后发生了什么?
Spring IoC 容器已准备好为应用程序提供 Bean,并且 ContextRefreshedEvent 事件已被发布。