springboot引導上下文載入過程和配置載入過程

我不是碼農發表於2022-11-23

初始化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)

相關文章