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