spring-源码2024.11.6

24 阅读3分钟

FileSystemXmlApplicationContext

PathMatchingResourcePatternResolver

从类路径、文件系统或URL中查找匹配模式的资源

setConfigLocations(configLocations);

该方法的意义在于,configLocations路径可以是${}

createEnvironment  --》new StandardEnvironment()

创建环境:StandardEnvironment 主要用于管理应用程序的属性源(Property Source):系统属性、环境变量、JNDI属性等;

refresh()

用于初始化和刷新应用上下文,确保所有的Bean都被正确地加载和初始化

加载配置:从配置文件或注解中加载配置信息

初始化BeanFactory:创建和初始化内部的BeanFactory

初始化单例Beans:预初始化所有单例Beans,确保它们在应用启动时已经准备好了

注册监听器:注册事件监听器,以便在应用上下文中处理事件

初始化应用上下文:执行一系列初始化步骤,确保应用上下文处于可用状态

AbstractApplicationContext.refresh() 执行流程方法

  • prepareRefresh() 刷新准备工作:初始化属性源(PropertySource)、关闭旧的上下文(如果存在旧的上下文,确保其正确关闭)、设置活动的配置文件(profiles)、初始化消息源(国际化 i18n)、初始化应用事件广播器(应用事件广播器,发布和监听应用事件)

  • obtainFreshBeanFactory()确保每次refresh方法被执行都获得一个干净的BeanFactory实例;销毁旧的BeanFactory,创建新的BeanFactory(DefaultListableBeanFactory),初始化BeanFactory(设置Bean工厂相关属性:classLoader、ParentBeanFactory),加载Bean定义。

  • prepareBeanFactory()对Bean工厂进行一些必要的初始化和配置。如:设置ConversionService(转换器)、注册默认的Bean后处理器、设置应用事件广播器

postProcessBeanFactory(beanFactory);

自定义BeanFactory处理(允许你在Bean工厂初始化之后进行一些自定义的处理)

扩展功能:提供一个钩子点,让你在Bean工厂初始化之后添加额外的功能或修改现有配置

invokeBeanFactoryPostProcessors(beanFactory);

1.调用Bean工厂后置处理器,对bean工厂进行更深层次的配置(修改bean定义、添加新的bean定义等) 2.调用Bean后置处理器:在bean的实例化和初始化之前或之后进行核外处理(修改Bean属性、添加额外行为)

registerBeanPostProcessors(beanFactory);

1.确保所有已注册的bean后置处理器被正确添加到Bean工厂

2.排序Bean后置处理器

initMessageSource();

1.初始化消息源

2.注册默认的消息源

initApplicationEventMulticaster();
  1. 初始化 ApplicationEventMulticaster:确保有一个 ApplicationEventMulticaster 实例可用,以便应用程序可以发布和处理事件。
  2. 注册默认的 ApplicationEventMulticaster:如果未显式配置 ApplicationEventMulticaster,则使用默认的实现(通常是 SimpleApplicationEventMulticaster)。
onRefresh();
  1. 执行特定于子类的刷新操作:子类可以通过重写 onRefresh 方法来执行特定的初始化或配置任务。
  2. 扩展 refresh 过程:在 refresh 过程中,onRefresh 方法是在所有通用的初始化步骤之后调用的,因此子类可以在此方法中执行任何需要的额外操作。
registerListeners();
  1. 注册 ApplicationListener:确保所有已定义的 ApplicationListener 被正确地注册到 ApplicationEventMulticaster 中。
  2. 发现并注册内置监听器:注册 Spring 内置的一些监听器,如 ApplicationEventMulticaster 自身的监听器。
finishBeanFactoryInitialization(beanFactory);
  1. 预实例化单例 Bean:遍历所有已注册的单例 Bean,并调用 preInstantiateSingletons 方法来预实例化这些 Bean。
  2. 确保所有必需的 Bean 都被创建:在应用程序启动时,确保所有必需的 Bean 都已经被创建和初始化,避免在运行时出现因 Bean 未初始化而导致的错误。
finishRefresh();
  1. 发布 ContextRefreshedEvent 事件:通知所有注册的监听器应用上下文已经刷新完成。
  2. 清理资源:执行一些清理操作,如关闭临时资源等。
  3. 调用 LifecycleProcessor.onRefresh 方法:通知所有实现了 SmartLifecycle 接口的 Bean 开始运行。