返回

Spring源码之九——finishRefresh方法详解

后端

Spring IoC 的 finishRefresh 方法:将 IOC 容器变为可用状态

简介

在 Spring IoC 容器的初始化过程中,finishRefresh 方法扮演着至关重要的角色,它将容器从初始化状态转变为已注册状态,即真正的可用状态。

finishRefresh 方法的意义

finishRefresh 方法的作用是触发一系列操作,让 Spring IoC 容器做好为应用程序提供服务的准备。这些操作包括:

  • 为所有非懒加载的单例 Bean 创建实例
  • 调用所有 FactoryBean 的 afterPropertiesSet 回调函数
  • 调用所有 AutowireCapableBeanFactory 的 postProcessBeanFactory 方法
  • 调用所有 Bean 的 afterPropertiesSet 方法
  • 调用所有 Bean 的 init-method
  • 发布 ContextRefreshedEvent 事件

finishRefresh 方法的流程

finishRefresh 方法的流程如下:

  1. 检查 Bean 定义是否为懒加载,如果不是,则创建 Bean 实例
  2. 调用所有 FactoryBean 的 afterPropertiesSet 回调函数
  3. 调用所有 AutowireCapableBeanFactory 的 postProcessBeanFactory 方法
  4. 调用所有 Bean 的 afterPropertiesSet 方法
  5. 调用所有 Bean 的 init-method
  6. 发布 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 能够被实例化和使用。

常见问题解答

  1. 为什么 finishRefresh 方法对于 Spring IoC 容器至关重要?
    finishRefresh 方法将容器从初始化状态转变为已注册状态,使容器能够为应用程序提供 Bean。

  2. finishRefresh 方法调用了哪些回调函数?
    finishRefresh 方法调用了 FactoryBean 的 afterPropertiesSet 回调函数、AutowireCapableBeanFactory 的 postProcessBeanFactory 方法以及 Bean 自己的 afterPropertiesSet 方法。

  3. 为什么需要为非懒加载的单例 Bean 创建实例?
    为了确保这些 Bean 在调用 getBean 方法时能够立即获取。

  4. finishRefresh 方法如何使 Bean 能够被使用?
    通过实例化 Bean、调用回调函数和执行 init-method,finishRefresh 方法使 Bean 能够被应用程序使用。

  5. 完成 finishRefresh 方法后发生了什么?
    Spring IoC 容器已准备好为应用程序提供 Bean,并且 ContextRefreshedEvent 事件已被发布。