导图社区 spring refresh主流程
这是一篇关于spring refresh主流程的思维导图,主要内容包括:spring refresh 刷新的整个流程,主要梳理脉络,类似一个索引,但是有讲明白了,该步骤主要做了什么事情,可以为后续你学习spring 建立一个清晰的脉络,这是一个脉络,我还有每个步骤的详细讲解,可参见个人主页。
编辑于2025-09-12 20:24:00这是一篇关于doGetBean的思维导图,主要内容包括:transformedBeanName,getSingleton,getSingleton 能够获取到了Bean实例对象,getSingleton 未获取到Bean实例对象,adaptBeanInstance。
这是一篇关于spring refresh主流程的思维导图,主要内容包括:spring refresh 刷新的整个流程,主要梳理脉络,类似一个索引,但是有讲明白了,该步骤主要做了什么事情,可以为后续你学习spring 建立一个清晰的脉络,这是一个脉络,我还有每个步骤的详细讲解,可参见个人主页。
社区模板帮助中心,点此进入>>
这是一篇关于doGetBean的思维导图,主要内容包括:transformedBeanName,getSingleton,getSingleton 能够获取到了Bean实例对象,getSingleton 未获取到Bean实例对象,adaptBeanInstance。
这是一篇关于spring refresh主流程的思维导图,主要内容包括:spring refresh 刷新的整个流程,主要梳理脉络,类似一个索引,但是有讲明白了,该步骤主要做了什么事情,可以为后续你学习spring 建立一个清晰的脉络,这是一个脉络,我还有每个步骤的详细讲解,可参见个人主页。
主流程
springboot 的run 方法
1. new AnnotationConfigServletWebServerApplicationContext 创建Context对象
构造函数
beanFactory = new DefaultListableBeanFactory()
DefaultListableBeanFactory 又继承了很多了,也同时会创建一些列父类对象
DefaultSingletonBeanRegistry
等等
new AnnotatedBeanDefinitionReader
创建了很多创始对象
注册了很多创始BeanDefinition
大名鼎鼎的 ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
EventListenerMethodProcessor
DefaultEventListenerFactory
new ClassPathBeanDefinitionScanner
2. refresh Context,开始进入容器的刷新过程
3. 总结
new了一个Context,支撑spring ioc 的所有的类基本都被创建了个遍
完成了IOC体系的创建
然后开始refresh流程
finishRefresh()
致此整个IOC容器,已经完成创建,并完成初始化操作
收尾工作
clearResourceCaches
initLifecycleProcessor
初始化生命周期处理器
先看BeanFactory中有没有LifecycleProcessor 的单例Bean
有
取出来,给到Context的lifecycleProcessor
没有
创建new一个DefaultLifecycleProcessor
给到Context,然后在注册到BeanFactory的单例Bean中
总结
给Context中的lifecycleProcessor赋值,
并注册到BeanFactory中
调用执行上面初始化的LifecycleProcessor
getLifecycleProcessor().onRefresh()
发布事件
getApplicationEventMulticaster()
获取事件发布器
multicastEvent
监听器监听,并执行器逻辑
还要执行父级的 发布事件
总结
清理相关缓存
初始化执行生命周期处理器
发布事件,通过事件发布器,执行所有的监听器
finishBeanFactoryInitialization(beanFactory);
初始化Bean工厂
核心点,通过getBean开始创建Bean对象实例、1
一些其他操作、2
清空classloader
释放一些configuration
实例化了哪些Bean、3
ConversionService
所有实现了LoadTimeWeaverAware 接口的Bean
所有的单例Bean
调用 所有实现了SmartInitializingSingleton 接口的afterSingletonsInstantiated 方法、4
关键点总结
getBean创建Bean实例对象
执行SmartInitializingSingleton 接口的后置实例化逻辑
registerListeners();
注册监听器
1. 获取事件发布器
getApplicationEventMulticaster()
2. Context的applicationListeners 已经放进来的监听器
3. 所有实现了ApplicationListener 接口的监听器
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
4. 然后将上面所有的监听器,注册到事件发布器中
5. 触发之前已经放到Context中的事件
总结
向事件发布器中,注册监听器
触发执行早起的Context中的时间监听器
onRefresh();
模板方法
各个不同类型的Context 实现各自的逻辑
springboot 的Context 在此处做了服务器的启动操作
Context级别的模板实现
initApplicationEventMulticaster();
先看BeanFactory中有没有ApplicationEventMulticaster 的单例Bean
有
取出来,给到Context的applicationEventMulticaster
没有
创建new一个SimpleApplicationEventMulticaster
给到Context,然后在注册到BeanFactory的单例Bean中
总结
给Context中的applicationEventMulticaster 赋值,
并注册到BeanFactory中
初始化Context的事件发布器
initMessageSource();
先看BeanFactory中有没有MessageSource 的单例Bean
有
取出来,给到Context的MessageSource
没有
创建new一个DelegatingMessageSource
给到Context,然后在注册到BeanFactory的单例Bean中
总结
给Context中的messageSource 赋值,
并注册到BeanFactory中
registerBeanPostProcessors(beanFactory);
做了哪些事情
找到所有实现了BeanPostProcessor 的类
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class
getBean创建BeanPostProcessor 对象
分类、排序,放到不同的list中
存到BeanFactory中
beanFactory.addBeanPostProcessor(postProcessor)
什么是BeanPostProcessor
postProcessBeforeInitialization(Object bean, String beanName)
Bean对象初始化前,前置可以对Bean对象进行修改
postProcessAfterInitialization(Object bean, String beanName)
Bean对象初始化后,后置可以对Bean对象进行修改
总结
就是在Bean初始化的前后,将BeanName以及Bean对象作为参数,传给你
让用户可以自定义修改Bean
总结
向BeanFactory中注册,在Bean初始化前后,可以对Bean对象修改的接口实现类
invokeBeanFactoryPostProcessors(beanFactory);
调用执行 BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
方法
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
主要目的:注册BeanDefinition
调用执行 BeanFactoryPostProcessor
方法
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
总结一下
调用所有实现了BeanDefinitionRegistryPostProcessor的实现类,往Context中注册BeanDefinition
调用 所有实现了BeanFactoryPostProcessor的实现类,对Context进行个性化修改配置
不是随意执行的,通过Ordered 对process进行排序,然后按照顺序执行
都是后置处理修改 BeanFactory 跟上一步的 postProcessBeanFactory(beanFactory); 区别是什么
postProcessBeanFactory 是Context级别的实现,对Context的修改
当前方法是钩子模板方法,所有实现了该接口的实现类,都可以修改,扩展
总结
按照 顺序有序的执行BeanFactoryPostProcessor 来填充Context
postProcessBeanFactory(beanFactory);
看了springboot 中Context对该类的实现,对BeanFactory做了哪些更改,总结如下
addBeanPostProcessor
ignoreDependencyInterface
registerWebApplicationScopes
registerEnvironmentBeans
针对 Annotationconfig 类的context
扫包
注解扫包实现的地方
得到Set<BeanDefinitionHolder> beanDefinitions
注册BeanDefinitionHolder 到BeanFactory
注册注解类
总结
就是允许不同的context 在此期间修改BeanFactory
参数是 beanFactory
这里就是针对各自不同的Context 定制化的修改了,
prepareBeanFactory(beanFactory);
创建所有Context公共的,初始对象
addBeanPostProcessor
ApplicationListenerDetector
ApplicationContextAwareProcessor
ignoreDependencyInterface
registerResolvableDependency
registerSingleton
obtainFreshBeanFactory();
springboot
将上面创建的BeanFactory直接返回,就没有做其他事情了
非springboot
创建了BeanFactory对象
然后 loadBeanDefinitions 加在了BeanDefinition
不管咋地,这一步走完,就获取到了一个BeanFactory
prepareRefresh();
各个Context 清理自己内部的缓存
初始化initPropertySources
创建了一些 事件监听相关的一些list与set
中心主题
prepareRefresh
模板方法
模板重写
实现
AnnotationConfigServletWebServerApplicationContext extends ServletWebServerApplicationContext implements AnnotationConfigRegistry
AnnotationConfigServletWebApplicationContext extends GenericWebApplicationContext implements AnnotationConfigRegistry
AnnotationConfigReactiveWebServerApplicationContext extends ReactiveWebServerApplicationContext implements AnnotationConfigRegistry
关键词总结
springboot
实现 clean自己的缓存,在调用父类的prepareRefresh
web类的context的入口
父类的prepareRefresh抽象实现
initPropertySources 模板,子类实现
子类实现
AbstractRefreshableWebApplicationContext extends AbstractRefreshableConfigApplicationContext implements ConfigurableWebApplicationContext, ThemeSource
GenericWebApplicationContext extends GenericApplicationContext implements ConfigurableWebApplicationContext, ThemeSource
StaticWebApplicationContext extends StaticApplicationContext implements ConfigurableWebApplicationContext, ThemeSource
关键词总结
springweb
来自于springweb包
ConfigurableEnvironment
StandardEnvironment
initPropertySources
MutablePropertySources implements PropertySources
key-value键值对
ServletConfig
ServletContext
两件事情
getEnvironment
initServletPropertySources
总结
1、子类清空自己的
2、抽象实现getEnvironment
3、抽象实现initServletPropertySources
中心主题
obtainFreshBeanFactory
获取一个BeanFactory
两个实现
AbstractRefreshableApplicationContext extends AbstractApplicationContext
创建DefaultListableBeanFactory
loadBeanDefinitions
抽象方法
AbstractXmlApplicationContext extends AbstractRefreshableConfigApplicationContext
AnnotationConfigWebApplicationContext extends AbstractRefreshableWebApplicationContext implements AnnotationConfigRegistry
GroovyWebApplicationContext extends AbstractRefreshableWebApplicationContext implements GroovyObject
XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext
关键字总结
不同的context,不同的load逻辑
springweb
然后返回BeanFactory
GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry
直接返回之前创建的
最终得到一个 ConfigurableListableBeanFactory 的 BeanFactory
最终得到一个 ConfigurableListableBeanFactory 的 BeanFactory
prepareBeanFactory
初始化往BeanFactory中添加一些创始类
addBeanPostProcessor(new ApplicationContextAwareProcessor(this))
beanFactory.ignoreDependencyInterface
beanFactory.registerResolvableDependency
beanFactory.registerSingleton
中心主题
postProcessBeanFactory
官方解释
Allows post-processing of the bean factory in context subclasses
允许在上下文子类中对bean工厂进行后处理
就是允许不同的context 在此期间修改BeanFactory
抽象实现
AbstractRefreshableWebApplicationContext
addBeanPostProcessor
ignoreDependencyInterface
registerWebApplicationScopes
registerEnvironmentBeans
AnnotationConfigReactiveWebServerApplicationcontext
scanner.scan(this.basePackages)
reader.register(ClassUtils.toClassArray(this.annotatedClasses))
AnnotationconfigServletWebApplicationcontext
scanner.scan(this.basePackages)
reader.register(ClassUtils.toClassArray(this.annotatedClasses))
AnnotationconfigServletWebServerApplicationContext
scanner.scan(this.basePackages)
reader.register(ClassUtils.toClassArray(this.annotatedClasses))
GenericWebApplicationContext
addBeanPostProcessor
ignoreDependencyInterface
registerWebApplicationScopes
registerEnvironmentBeans
ServletWebServerApplicationContext
addBeanPostProcessor
ignoreDependencyInterface
registerWebApplicationScopes
StaticWebApplicationContext
关键词总结
addBeanPostProcessor
ignoreDependencyInterface
registerWebApplicationScopes
registerEnvironmentBeans
针对 Annotationconfig 类的context
扫包
注解扫包实现的地方
得到Set<BeanDefinitionHolder> beanDefinitions
注册BeanDefinitionHolder 到BeanFactory
注册注解类
中心主题
invokeBeanFactoryPostProcessors
干了三件事
分类执行
调用执行 BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
方法
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
调用执行 BeanFactoryPostProcessor
方法
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
1、分类执行
2、BeanDefinitionRegistryPostProcessor
实现类
关键实现介绍
ConfigurationClassPostProcessor
postProcessBeanDefinitionRegistry
1、找到所有的@Configuration的类,得到一个 String[] candidateNames
1、创建 ConfigurationClassParser parser,取解析 String[] candidateNames
2、parser.parse(candidates) 解析@Component、@PropertySources、@ComponentScan、@Import、@ImportResource、@Bean等注解以及 Interfaces、superclass 转换为 ConfigurationClass
3、将解析的ConfigurationClass 存入一个Map<ConfigurationClass, ConfigurationClass> configurationClasses的集合中
4、reader.loadBeanDefinitions(configClasses)将configClasses 转换为BeanDefinition
关键词总结
1、找@Configuration
2、递归找 很多注解
@Component、@PropertySources、@ComponentScan、@Import、@ImportResource、@Bean等注解
转换为 ConfigurationClass
3、将找到的ConfigurationClass进行loadBeanDefinitions 转换为BeanDefinition 注册到BeanFactory中
AnnotationBeanDefinitionRegistryPostProcessor
registerBeanDefinitions(BeanDefinitionRegistry registry, String[] basePackages)
Set<BeanDefinitionHolder> primaryBeanDefinitionHolders = scanner.doScan(basePackages)
logPrimaryBeanDefinitions
关键词总结
1、根据basePackages 扫包
2、注册BeanDefinition
ImportsCleanupPostProcessor
postProcessBeanDefinitionRegistry
从BeanDefinitionRegistry 中获取所有的Bean定义
如果是testClass 则将其从 BeanDefinitionRegistry 中remove掉
关键词总结
可以从参数BeanDefinitionRegistry registry 中删除BeanDefinition
等等其他
关键词总结
参数是BeanDefinitionRegistry registry
可以删除BeanDefinition
可以注册BeanDefinition
不同的BeanDefinitionRegistryPostProcessor 做不同的实现
能修改,能新增BeanDefinition
3、BeanFactoryPostProcessor
Bean工厂后置处理器
一些实现类
有往beanFactory 里面添加 process的
有取出来BeanDefinition 修改属性的
有 取出 Properties 修改配置值的
关键词总结
参数是 ConfigurableListableBeanFactory beanFactory
你能拿到的都可修改
具体实现看对应的process,
但是只能修改BeanDefinition,不能新增
中心主题
registerBeanPostProcessors
顾名思义
注册BeanPostProcessors
关键步骤
1、String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
2、for (String ppName : postProcessorNames) 分类不同的BeanPostProcessor
3、sortPostProcessors
4、registerBeanPostProcessors
将BeanPostProcessor add 到Bean工厂中
中心主题
initMessageSource
顾名思义
注册MessageSource
做了两件事
创建了一个对象 DelegatingMessageSource extends MessageSourceSupport implements HierarchicalMessageSource
注册MessageSource 到BeanFactory
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
中心主题
initApplicationEventMulticaster
顾名思义
初始化context的 事件广播器
就拿了两件事
创建了一个广播器对象
new SimpleApplicationEventMulticaster
注册到BeanFactory
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
中心主题
onRefresh();
模板方法
实现类
GenericWebApplicationContext extends GenericApplicationContext implements ConfigurableWebApplicationContext
ReactiveWebServerApplicationContext extends GenericReactiveWebApplicationContext implements ConfigurableWebServerApplicationContext
看实现也是启动的容器
ServletWebServerApplicationContext extends GenericWebApplicationContext implements ConfigurableWebServerApplicationContext
springboot 启动会走此方法,启动Tomcat容器
StaticWebApplicationContext extends StaticApplicationContext implements ConfigurableWebApplicationContext, ThemeSource
关键词总结
各个不同类型的Context 实现各自的逻辑
springboot在此处做了Tomcat容器的启动
registerListeners
注册监听器
关键步骤
1、拿到在第7步创建的时间广播器
getApplicationEventMulticaster()
2、找到所有的ApplicationListener
Application中已经存在的
所有实现了ApplicationListener 的所有的Bean
3、添加到广播器中
addApplicationListener
addApplicationListenerBean
4、触发早起的(已经存在于application中的) 事件ApplicationEvent
ApplicationEvent实现
中心主题
finishBeanFactoryInitialization
完成BeanFactory的初始化
这个过程就一件事
getBean 真正的完成一些Bean的创建
创建Bean实例
1、创建ConversionService 类型的Bean
类型转换器
2、往BeanFactory中添加了StringValueResolver 解析器
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
3、getBean 创建所有LoadTimeWeaverAware extends Aware 类型的Bean
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
然后For循环 去getBean
4、初始化创建所有的单例Bean
preInstantiateSingletons
创建所有:非抽象的、非懒加载的、并且是单例的Bean
找到所有 实现了SmartInitializingSingleton 接口的Bean实例(前面已经创建了)
调用接口的afterSingletonsInstantiated 实现
中心主题
finishRefresh
clearResourceCaches()
initLifecycleProcessor
为Context初始化生命周期的processor
new DefaultLifecycleProcessor();
beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
getLifecycleProcessor().onRefresh()
紧接着就获取上面初始化的LifecycleProcessor
然后执行其逻辑onRefresh
找到所有实现了生命周期接口Lifecycle的类
Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
并做好分组
Map<Integer, LifecycleGroup> phases
循环调用接口的start方法
phases.values().forEach(LifecycleGroup::start);
publishEvent(new ContextRefreshedEvent(this));
发布最后的事件
两件事
发布当前容器的事件
getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
如果父容器存在,发布父容器的事件
parent.publishEvent(event);