初始化SpringApplication:
getSpringFactoriesInstances获取BootstrapRegistryInitializer、ApplicationContextInitializer、ApplicationListener;发布SpringApplicationRunListeners#starting事件

初始化执行Environment:
初始化类型为ApplicationServletEnvironment的Environment(初始化MutablePropertySources:包括servletContextInitParams(ServletContext)、servletConfigInitParams(ServletConfig)、jndiProperties、systemEnvironment(System.getenv())、systemProperties(System.getProperties())初始化ApplicationConversionService),并把启动args也作为一个PropertySource加入到MutablePropertySources,之后会把所有的PropertySource封装成SpringConfigurationPropertySources(通过SpringConfigurationPropertySource.from进行转换,使用PropertyMapper来映射PropertySource和ConfigurationPropertySource之间的字段名关系,比如下划线改字母大写,‘.’‘-’等符号的处理)

之后发布SpringApplicationRunListeners#environmentPrepared事件,(spring引导上下文加载过程)
就一个监听器BootstrapApplicationListener监听了该事件,里面会判断spring.cloud.bootstrap.enabled属性是否继续执行,创建SpringBoot自己的引导上下文BootstrapContext,并把创建的context设为父上下文;父上下文里会创建StandardEnvironment,然后会把清空掉MutablePropertySources,并新增一个bootstrap的PropertySource,在把主上下文的PropertySource都加进来,之后开始构建上下文(web类型为NONE,所以Bootstrap Context初始化不会启动tomcat,同时会注入一个BootstrapImportSelectorConfiguration,用来扫描BootstrapConfiguration注解的配置类,Bootstrap Context启动的时候会执行),构建之后就初始化Bootstrap Context,构建的上下文类型是AnnotationConfigApplicationContext,执行过程中environmentPrepared阶段会执行发布ApplicationEnvironmentPreparedEvent事件,其中EnvironmentPostProcessorApplicationListener接受处理事件,获取所有EnvironmentPostProcessor类型对Environment的PropertySource进行处理或新增(包括对json的处理,对随机数的处理,新增springCloudClientHostInfo的PropertySource,对bootstrap.yml的加载和spring.cloud.config的处理ConfigDataEnvironmentPostProcessor等等)ConfigDataEnvironmentPostProcessor里是通过ConfigDataLocationResolver先找匹配file:./ file:./config/ file:./config/*/,再匹配classpath:/ classpath:/config/

引导上下文启动完成后,主上下文在ApplicationEnvironmentPreparedEvent事件回调中ConfigFileApplicationListener加载application*.yml,构建上下文的类型是AnnotationConfigServletWebServerApplicationContext,prepareContext准备过程中,执行Initializers回调(其中的PropertySourceBootstrapConfiguration通过PropertySourceLocator(该接口springcloud提供,nacos就是通过实现了该规范来进行配置的读取设置操作的)加载PropertySource)


我不是码农
3 声望1 粉丝

java开发码农