SpringBoot源码-上下文AnnotationConfigServletWebServerApplicationContext
1. UML图
2. 初始化
- BeanFactory初始化为DefaultListableBeanFactory实例
- 初始化AnnotatedBeanDefinitionReader实例
- 初始化lassPathBeanDefinitionScanner实例
- Environment初始化为StandardServletEnvironment实例
3. SpringApplication中prepare上下文过程
- setEnvironment,注意,此时把初始化给的默认Environment替换掉,包括reader和scanner中
- postProcess过程:
- beanFactory中放入非空的beanNameGenerator实例,注意默认为空
- 接收非空的resourceLoader及其classLoader,注意默认为空
- 接收非空,注意默认为空
- beanFactory实例setConvertionService,取的是共享的单例
- 调用ApplicationContextInitializer实例的initialize方法,这些实例是在SpringApplication初始化过程中从spring.factory中加载的
- DelegatingApplicationContextInitializer:调用"context.initializer.classes"属性定义的所有类的initialize方法
- SharedMetadataReaderFactoryContextInitializer:注册BeanFactoryPostProcessor:CachingMetadataReaderFactoryPostProcessor
- ContextIdApplicationContextInitializer:初始ApplicationContextId,优先取spring.application.name定义的值,没有默认"application",并把对应的ContextId对象注册到BeanFactory
- ConfigurationWarningsApplicationContextInitializer:注册BeanFactoryPostProcessor:ConfigurationWarningsPostProcessor,其不允许@ComponentScan对应的值为"org"或"org.springframework"
- ServerPortInfoApplicationContextInitializer:注册ApplicationListener:自己,其处理
local.server.port属性,中间的server可能被ServerNamespace指定的值替代 - ConditionEvaluationReportLoggingListener:新增一个ApplicationListener:ConditionEvaluationReportListener
- 发布contextPrepared事件到所有的ApplicationListener:
- BackgroundPreinitializer:无操作
- DelegatingApplicationListener:无操作
- 打印Start Up Log,打印Profile
- beanFacotry注册Bean
springApplicationArguments:ApplicationArguments - beanFacotry注册Bean
springBootBanner - 根据先前读取的值设置beanFactory的allowBeanDefinitionOverriding属性,Dubbo会默认将其设为true
- 根据SpringApplication.run()中的参数列表,读取主source,一般来说就是run方法的Class变量
- 解析上一步配置的resource为BeanDefinition,并放入BeanFactory,详情见@Configuration 配置处理
- 广播ApplicationPreparedEvent事件:
- ConfigFileApplicationListener:注册BeanFactoryPostProcessor:PropertySourceOrderingPostProcessor
- LoggingApplicationListener:注册Bean:
springBootLoggingSystem:this.loggerSystem
4. SpringApplication中refresh上下文
- prepare:处理PropertySource
- obtainFreshBeanFactory
- prepareBeanFactory:
- 初始化ClassLoader
- 注册BeanPostProcessor:ApplicationContextAwareProcessor,并将各种Aware添加到忽略列表
- 注册BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext为可Autowire的Bean,指向BeanFactory本身
- 注册BeanPostProcessor:ApplicationListenerDetector
- 注册Bean:
environment,systemProperties,systemEnvironment,这些在Environment的准备过程中已经OK
- postProcessBeanFactory:
- 注册BeanPostProcessor:WebApplicationContextServletContextAwareProcessor
- 忽略ServletContextAware
- scanBasePackage,这里扫描的是直接手动初始化上下文时给定的basePackage
- 调用BeanFactoryPostProcessor,注意这里的Factory:
- 调用所有的BeanDefinitionRegistryPostProcessor:
- SharedMetadataReaderFactoryContextInitializer:注册SharedMetadataReaderFactoryBean,name为
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory,并将这个对象放入org.springframework.context.annotation.internalConfigurationAnnotationProcessor这个Bean的Property列表中 - ConfigurationWarningsApplicationContextInitializer:检查basePackage是否非法
- SharedMetadataReaderFactoryContextInitializer:注册SharedMetadataReaderFactoryBean,name为
- 调用上面这一步处理后新加入的BeanDefinitionRegistryPostProcessor:
- 先调用@PriorityOrdered
- ConfigurationClassPostProcessor:读取所有@Configuration注解的BeanDefinition,见[Spring处理@Configuration]
- 再调用@Ordered
- 最后调用剩余的
- 先调用@PriorityOrdered
- 调用一遍上面拿到的BeanFactoryPostProcessor的postProcessBeanFactory方法,这里有个Spring默认的,会把Property列表中默认的defaultProperties放到最后
- 遍历扫出来的所有的Bean,找到新加入的BeanFactoryPostProcessor,调用postProcessBeanFactory方法:
- PropertySourcesPlaceholderConfigurer:处理@Value和其他的$
- 加载loadTimeWeaver
- 调用所有的BeanDefinitionRegistryPostProcessor:
- 注册BeanPostProcessor,顺序同样@PriorityOrdered>@Ordered>其他,调用beanFactory的getBean方法来初始化实例,并放入beanFactory的BeanPostProcessor列表中,其中有一类非常特殊,实现了MergedBeanDefinitionPostProcessor接口,标明这些类会在beanDefinition生成后,实例化BeanPostProcessor之前被调用
- 初始化MessageSource
- 初始化applicationEventMulticaster
- onRefresh方法:
- 初始化themeSource
- 初始化webServer:调用ServletWebServerFactory,见
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#createWebServer
- 把原来的pplicationListener注册到上面初始化的applicationEventMulticaster里,并广播暂存的earlyApplicationEvents事件
- 完成BeanFactory初始化,提前初始化所有非懒加载的Bean:
- 初始化conversionService
- 初始化LoadTimeWeaverAware
- 初始化Spring内置的辅助工具类:注解辅助类等
- 调用所有SmartInitializingSingleton类型的Bean的afterSingletonsInstantiated方法
- 收尾,清理缓存,调用LifecycleProcessor,广播ContextRefreshedEvent:
- 清理缓存
- 发布ContextRefreshedEvent事件
- LiveBeansView注册Mbean
- 启动WebServer
- 发布ServletWebServerInitializedEvent事件
- ServerPortInfoApplicationContextInitializer:注册端口信息到Property
Refresh完成
评论