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支撐程序後續的運行。