SpringBoot啓動流程資源文件初始化分析

1. SpringApplication.run(StartClass.class,args);--->啓動類main方法調用SpringApplication靜態run方法

2. SpringApplication類中將資源文件裝載到Object[] 數組中:我們傳入的參數爲 SpringApplication.class

public static ConfigurableApplicationContext run(Object source, String... args) {
   return run(new Object[] { source }, args);
}

3.SpringApplication類的構造器初始化sources資源文件,然後調用run(args)啓動方法;

public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
   return new SpringApplication(sources).run(args);//利用構造器初始化資源文件,run方法運行啓動流程
}
public SpringApplication(Object... sources) {
   initialize(sources);//初始化資源文件
}
private void initialize(Object[] sources) {
   if (sources != null && sources.length > 0) {  //將數組元素賦值給sources集合
      this.sources.addAll(Arrays.asList(sources));//this.sources是一個LinkedHashSet集合
   }
   this.webEnvironment = deduceWebEnvironment();//通過是否包含 WEB_ENVIRONMENT_CLASSES 數組中的類判定是否是web應用程序(javax.servlet.Servlet,org.springframework.web.context.ConfigurableWebApplicationContext)
   setInitializers((Collection) getSpringFactoriesInstances(
         ApplicationContextInitializer.class));//初始化ApplicationContextInitializer
   setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//初始化ApplicationListener
   this.mainApplicationClass = deduceMainApplicationClass();//獲取mainApplicationClass對象實例
}

ApplicationContextInitializer初始化爲7個對象集合:
0-ConfigurationWarningsApplicationContextInitializer:可以檢查配置,在有常見錯誤配置時打印錯誤信息的BeanFactoryPostProcessor

1-ContextIdApplicationContextInitializer:爲ApplicationContext設置Id
2-DelegatingApplicationContextInitializer:在context.initializer.classes中配置委託其他初始化器
3-ServerPortInfoApplicationContextInitializer:設置環境變量local.server.port以方便測試
4-SharedMetadataReaderFactoryContextInitializer:
5-AutoConfigurationReportLoggingInitializer:
6-RestartScopeInitializer:

ApplicationListener初始化爲11個對象集合:
0-ClearCachesApplicationListener:加載上下文後清理緩存
1-ParentContextCloserApplicationListener:監聽父ApplicationContext,如果父關閉,則關閉當前上下文
2-FileEncodingApplicationListener:監聽系統文件編碼與環境編碼是否一致,不一致打印日誌,啓動終止
3-AnsiOutputApplicationListener:根據spring.output.ansi.enable配置ANSI輸出
4-ConfigFileApplicationListener:搜索並加載配置文件,設置enviroment
5-DelegatingApplicationListener:加載並轉發事件至context.listener.classes中配置的ApplicationListener
6-LiquibaseServiceLocatorApplicationListener:將liquibase.servicelocator.ServiceLocator替換成適用於springboot版本
7-ClasspathLoggingApplicationListener:程序啓動日誌打印,正常打印classpath到debug,失敗打印到info
8-LoggingApplicationListener:根據配置在合適的時候初始化日誌配置
9-BackgroundPreinitializer:
10-RestartApplicationListener:

mainApplicationClass

this.mainApplicationClass = deduceMainApplicationClass();

private Class<?> deduceMainApplicationClass() {
   try {
      StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();//獲取當前調用棧
      for (StackTraceElement stackTraceElement : stackTrace) {
         if ("main".equals(stackTraceElement.getMethodName())) {//找到main方法所在的啓動類
            return Class.forName(stackTraceElement.getClassName());//返回main方法所在類的對象實例
         }
      }
   }
   catch (ClassNotFoundException ex) {
      // Swallow and continue
   }
   return null;
}
由此可初始化啓動類,並且初始化設置ApplicationContextInitializer和ApplicationListener支撐程序後續的運行。






























































































































































































































































































































































































































































































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章