new SpringApplication()
记录primarySources
判定webApplicationType(具体流程可参考相关流程图)
规则:
有引入spring MVC框架或者jersey框架则返回WebApplicationType.SERVLET。
存在Org.springframework.web.reactive.DispatcherHandler类则返回WebApplicationType.REACTIVE。
不存在javax.servlet.Servlet或org.springframework.web.context.ConfigurableWebApplicationContext则返回NONE
其他则默认SERVLET
设置initializers
SpringFactoriesLoader负责加载spring.factories配置;该处将返回org.springframework.context.ApplicationContextInitializer的所有bean实例
设置ApplicationListener相关的所有listener
spring.factories中设置的org.springframework.context.ApplicationListener的所有bean实例
获取SpringApplicationRunListeners相关的listener
spring.factories中设置的org.springframework.boot.SpringApplicationRunListener相关的所有bean实例。其中有一个EventPublishingRunListener类型的bean,在初始化时,会将上一步的ApplicationListener类型的listerners全部注册起来。
prepareEnvironment
springboot在此之前将从bean工厂中获取SpringApplicationRunListner类型的bean,然后封装程SpringApplicationRunListners对象传入此方法。而该方法主要负责遍历调用各个监听器的environmentPrepared方法
configureIngoreBeanInfo
设置spring.beaninfo.ignore,用途暂未知
createApplicationContext
如果WebApplicationType是SERVLET则使用org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
如果是REACTIVE,则使用org.springframework.boot.web.servlet.context.AnnotationConfigReactiveWebServerApplicationContext
prepareContext
给context设置environment ....
将context传给所有initializer初始化一遍
将context传给所有应用监听器prepareContext一遍
创建启动类对应的bean
遍历各监听器的contextLoaded方法
refreshContext
AnnotationConfigReactiveWebServerApplicationContext.refresh
prepareRefresh()
prepareBeanFactory(beanFactory):
postProcessBeanFactory(beanFactory)
invokeBeanFactoryPostProcessors(beanFactory) 读出入口应用所在包下的所有注解bean类,初始化bean
registerBeanPostProcessors(beanFactory)
onRefresh()-->创建webserver。并调用WebServerFactoryCustomizer相关bean(由EmbededWebServerFactoryCustomizerAutoConfigureation等配置类创建)进行个性化设置。
registerListeners()
finishBeanFactoryInitialization(beanFactory)-->触发注册用户自定义的监听器(ApplicationListenerDetector.postProcessAfterInitialization(bean, beanName))
finishRefresh()