SpringBoot 2.5.x 源码
2025-06-13 10:58:13 1 举报
spring 流程图(持续更新)
作者其他创作
大纲/内容
listeners.running() > 2.6.0listeners.ready()
applicationContextFactory.create()
根据Condition判断是否需要跳过
listeners.starting()
registerResolvableDependency()
......
new ApplicationServletEnvironment()
webApplicationType
1. 加载classpath:META-INF/spring.factories配置2. 实例化ApplicationListener配置类
setResourceLoader()
getBean()
new ClassPathBeanDefinitionScaner(this)
1. 加载classpath:META-INF/spring.factories配置2. 实例化SpringApplicationRunListeners配置类3. 排序
BeanDefinitionRegistryPostProcessor
reader
refreshContext()
registerPostProcessor()
super.postProcessBeanFactory()
BeanFactoryPostProcessor
获取注解元数据(获取启动类上的所有注解,以及标了@Inherited的注解)
postProcessAfterInitialization()
postProcessBeanFactory()
metadata = AnnotationMetadata.introspect(beanClass)
ApplicationContext.class
preInstantiateSingletons()
// 将上述通用注解的配置设置到BeanDefinition中通过setter方法设置:abd.setXxx()
postProcessApplicationContext()
getBeanFactory()
setTempClassLoader(ContentTypeMatchClassLoader)
MapperScannerConfigurer.java
afterRefresh()
DefaultEventListenerFactory.class
new LazyInitializationBeanFactoryPostProcessor()new PropertySourceOrderingBeanFactoryPostProcessor()
resolveBeforeInstantiation()
false
configEnvironment()
finishBeanFactoryInitialization()
createBootstrapContext()
register()
afterSingletonsInstantiated()
createBeanFatory()
当前注解或注解的父类有@Conditional注解
new LoadTimeWeaverAwareProcessor()
3. webApplicationType推断应用程序类型
createBean()
invokeBeanDefinitionRegistryPostProcessors()
2. primarySources
7. mainApplicationClass
ConfigurationClassPostProcessor.java
context.addBeanFactoryPostProcessor()
1. 加载classpath:META-INF/spring.factories配置2. 实例化ApplicationContextInitializer配置类
register Ordered
loadBeanDefinitions()
new ApplicationListenerDetector()
5. setInitializers()
Listener相关
obtainFreshBeanFactory()
freezeConfiguration()
postProcessBeforeInstantiation()
new ApplicationContextAwareProcessor()
1. 加载classpath:META-INF/spring.factories配置2. 实例化ApplicationContextFactory配置类
ApplicationEventPublisher.class
准备上下文将当前启动类注册成BeanDefinition注册了一些PostProcessor
new BeanDefinitionLoader()
AutowiredAnnotationBeanPostProcessor.class
@WebServiceRef@EJB@Resource@PostConstruct@PreDestroy
处理单例bean处理原型bean处理Scope Bean
configureConfigurationClassPostProcessor
listeners.environmentPrepared()
customizeBeanFatory()
registry.registerBeanDefinition(...)
onRefresh()
xmlReader = new XmlBeanDefinitionReader(registry)
doRegisterBean()
registerListeners()
调用所有实现了BeanFactoryPostProcessor接口的类
addPropertyEditorRegistrar()
loader.load()
new AnnotationConfigServletWebServerApplicationContext()
addBeanPostProcessor()
@Autowired@Value
getRunListeners()
invokeBeanFactoryPostProcessors()
env.validRequiredProperties()
metadata.isAnnotated 具体逻辑1. 指定的注解(Conditional.class)是否在annotationFilter扫描的包范围内?2. 待继续更新
scanner.scan()
createWebServer()ServletWebServerApplicationContext.java
configureAdditionalProfiles()
applyBeanPostProcessorsBeforeInstantiation()
ConfigurableWebEnvironment.initPropertySources()
request、session、application
listeners.started()
new SpringApplication()
refreshBeanFatory()
registerScope()
ignoreDependencyInterface()
context.setEnvironment()
load()自动装配在此过程中完成
new DefaultListableBeanFatory()
register()
propertyValues.add(\"metadataReaderFactor\
ApplicationContextInitializer.initialize()
setClassloader()
metadata == null || !metadata.isAnnotated(Conditional.class.getName())
registerAnnotationConfigProcessors()
DelegatingApplicationContextInitializerSharedMetadataReaderFactoryContextInitializerContextIdApplicationContextInitializerConfigurationWarningApplicationContextInitializerRSocketPortInfoApplicationContextInitializerServerPortInfoApplicationContextInitializerConditionEvaluationReportLoggingListener
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd)
CommonAnnotationBeanPostProcessor.class
run()
finishRefresh()
initApplicationEventMulticaster()
StandardAnnotationMetadata.from(type)
listeners.contextPrepared()
doGetBean()
EventListenerMethodProcessor.class
getOrCreateEnvironment()
new BeanPostProcessorChecker()
Consul配置中心解析过程PropertySourceBootstrapConfiguration.java -- ConsulPropertySourceLocator
创建BeanDefinitionHolder- 若不需要代理,直接返回原始BeanDefinitionHolder,再注册到容器- 若需要代理,则创建代理类型BeanDefinitionHolder 1.将原始BeanDefinition进行注册 2.然后返回代理类型的BeanDefinitionHolder,再注册到容器
conditionEvaluator.shouldSkip(abd.getMetadata())
addBeanPostProcessor(LoadTimeWeaver)
groovyReader = new GroovyBeanDefinitionReader(registry)
ResourceLoader.class
registerWebApplicationScopes()
internalCachingMetadataReaderFactory
printBanner()
setBeanNameGenerator()setResourceLoader()setEnvironment()
createBeanDefinitionLoader()
register PriorityOrdered
BootstrapApplicationListenerLoggingSystemShutdownListenerEnvironmentPostProcessorApplicationListenerAnsiOutputApplicationListenerLoggingApplicationListenerBackgroundPreinitializerRestartListenerDelegatingApplicationListenerParentContextCloserApplicationListenerClearCachesApplicationListenerFileEncodingApplicationListenerLiquibaseServiceLocatorApplicationListener
1. 加载classpath:META-INF/spring.factories配置2. 实例化Bootstrapper配置类3. 调用initialize接口注:2.6 已移除该接口改用BootstrapRegistryInitializer
@EventListener
postProcessBeanDefinitionRegistry
bindToSpringApplication(env)
N
registerBeanDefinition()
AbstractApplicationContext.refresh()
annotatedReader
prepareBeanFactory()
prepareRefresh()
configurePropertiesSources()
registerDependentBean()
4. bootstrapRegistryInitializers
includeFilters 过滤器中新增:1. Component.class2. javax.annotation.ManagedBean3. javax.inject.Named
SharedMetadataReaderFactoryContextInitializer
listeners.contextLoaded()
ConditionEvaluator#shouldSkip
applyBeanPostProcessorsAfterInitialization()
configHeadlessProperty()
ConfigurationClassPostProcessor.class
configureIgnoreBeanInfo()
refresh()
...
initPropertySources()
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass)
font color=\"#e74f4c\
initMessageSource()
createEnvironment()
postProcessBeanDefinitionRegistry()
从系统环境变量中读取:java.awt.headless属性,默认为true,开启header打印
获取Condition
configureConfigurationClassPostProcessor()
scanner
registerSingleton()
SharedMetadataReaderFactoryContextInitializer.java
@Lazy@Primary@DependsOn@Role@Description
内部BeanDefinition加载注册BootstrapImportSelectorConfiguration
configureProfiles()
读取系统环境变量spring.beaninfo.ignore
6. setListeners()
registerBeanPostProcessors()
reader.register()
setEnvironment()
BeanDefinitionCustomizercustomizer.customize(abd);
register nonOrdered
prepareEnvironment()
registerDefaultFilters()
BeanDefinition相关
ConfigurationWarningsApplicationContextInitializer.java
图片bannerspring.banner.image.location (\"gif\
initializer.initialize(...)1. 创建默认的DefaultBootstrapContext2. 执行BootstrapRegistryInitializer初始化方法
new WebApplicationContextServletContextAwareProcessor()
AnnotationFilter.PLAIN ↓annotationFilter = new PackagesAnnotationFilter(\"java.lang\
Y:匹配则跳过
遍历ComponentClassesregisterBean(componentClass)
setBeanClass(beanClass)
无@Conditional注解
true
new AnnotatedBeanDefinitionReader(this)
createApplicationContext()
1. 加载classpath:META-INF/spring.factories配置 2. 实例化ApplicationContextInitializer配置类3. 调用initialize方法
GenericApplicationContext.javaAbstractRefreshableApplicationContext.java
1. resourceLoader
this.nestedAnnotationsAsMap = nestedAnnotationsAsMap;
new StandardServletEnvironment()
调用所有实现了BeanDefinitionRegistryPostProcessor接口的类
applyInitializers()SpringApplication.java
Spring 5.xSpringBoot 2.5.x 源码
registerSingleton(BeanNameGenerator)setResourceLoadersetClassLoadersetConversionService
getMergedLocalBeanDefinition()
multicastEvent()
prepareContext()
初始化非懒加载的单例bean
0 条评论
下一页