spring 中的 refresh()方法

333 阅读2分钟

refresh() 是 Spring 容器(通常是 ApplicationContext 类及其子类)的核心方法,负责启动和初始化容器以及完成 Bean 的实例化、依赖注入、生命周期管理等一系列过程。在 Spring 应用程序启动时,调用 refresh() 方法会触发整个 IoC 容器的构建与启动逻辑。以下是 refresh() 方法的大致步骤和关键子过程:

  1. 同步控制: 为了确保在多线程环境下容器只被初始化一次,refresh() 方法通常以 synchronized 关键字修饰或在其内部进行同步控制。
  2. 准备工作: prepareRefresh(): 这是 refresh() 的第一步,主要进行刷新前的准备工作,如记录开始时间、标记容器为正在刷新状态、初始化默认的属性源等。 可能包含子类自定义的初始化逻辑,如个性化属性设置。
  3. 获取 Bean 工厂: obtainFreshBeanFactory(): 创建或刷新实际承载 Bean 定义和实例的 BeanFactory 对象(通常是 DefaultListableBeanFactory 或其他实现)。 这一步可能涉及到读取配置(如 XML、Java 配置类、注解配置等)、解析 Bean 定义并注册到 BeanFactory 中。
  4. 预处理 Bean 工厂: prepareBeanFactory(beanFactory): 对获取到的 BeanFactory 进行进一步的预处理,如设置类加载器、添加 Bean 后处理器、注册默认的 Bean 实例(如 BeanFactoryAware 接口的处理器等)、配置 AOP 相关设施等。
  5. Bean 定义的后处理: 调用 postProcessBeanFactory(beanFactory),允许通过 BeanFactoryPostProcessor 接口的实现来修改已经加载但尚未实例化的 Bean 定义。这一步通常用于第三方库或用户自定义的元数据调整,如属性占位符替换、自动配置等。
  6. Bean 实例化与初始化: 调用 invokeBeanFactoryPostProcessors(beanFactory),执行 BeanDefinitionRegistryPostProcessor 和常规的 BeanFactoryPostProcessor。 初始化所有非懒加载的单例 Bean,包括调用它们的初始化方法和应用 BeanPostProcessor。
  7. 注册监听器: 如果容器实现了 ApplicationEventPublisher 接口,会注册所有的 ApplicationListener,以便在后续事件发布时能够得到通知。
  8. 发布 Context 初始化事件: 发布一个 ContextRefreshedEvent,通知所有已注册的监听器容器已经初始化完毕。
  9. 最后清理: 清理任何可能存在的临时状态,如在刷新过程中使用的 Bean 定义缓存。
  10. 异常处理:
  • 在整个 refresh() 过程中,如果发生任何异常,容器将进入错误状态,并在适当的时候抛出异常。 以上是对 Spring 容器 refresh() 方法的主要步骤和逻辑的概括。实际源码可能会包含更详细的实现细节和额外的校验、调试输出等。这些步骤共同协作,确保 Spring 容器能够正确、高效地创建和管理应用程序中的 Bean,实现依赖注入和面向切面编程等功能