springboot啓動流程

@EnableDiscoveryClient
@SpringBootApplication
public class ProducerApplication {

    public static void main(String[] args) {
    SpringApplication application = new SpringApplication(Application.class);
    //application.setDefaultProperties(Properties properties); 能夠設置參數
    ConfigurableApplicationContext context = application.run(args);
   }
}
1.建立SpringApplication對象,傳入資源問題
    1.1 initialize()初始化容器資源
         1.1.1 將配置資源文件設置個 List<Object> sources對象。
         1.1.2 判斷當前是否web環境, 根據查詢當前環境中有沒有"javax.servlet.Servlet",  "org.springframework.web.context.ConfigurableWebApplicationContext" 字節碼文件作判斷。
         1.1.3 從META-INF/spring.factories配置文件中加載 ApplicationContextInitializer類,並建立對象,返回對象List賦值給SpringApplication的initializers屬性
         1.1.4 從META-INF/spring.factories配置文件中加載 ApplicationListener類,並建立對象, 返回listenter對象的List賦值給SpringApplication的listeners屬性。
         1.1.5 判斷啓動類。    
         (此時能夠經過SpringApplication對象設置系統配置, sa.setDefaultProperties(Properties defaultProperties))
    
2.執行sa.run(args)函數
     2.1 經過configureHeadlessProperty()方法設置"java.awt.headless"屬性,先從系統設置中獲取,若是取到則不作處理,若是沒取到,則設置true進去。
    
    2.2 從META-INF/spring.factories配置文件中加載 SpringApplicationRunListener類,並建立對象, 將listenter對象的List對象做爲參數建立
         SpringApplicationRunListeners(listeners)對象實例,並返回。
         
         SpringApplicationRunListener {
             void starting();
             void environmentPrepared(ConfigurableEnvironment environment);
             void contextPrepared(ConfigurableApplicationContext context);
             void contextLoaded(ConfigurableApplicationContext context);
             void finished(ConfigurableApplicationContext context, Throwable exception);
          }
         
    2.3 listeners.starting() 執行全部SpringApplicationRunListener的starting()方法。
    
    2.4 設置應用參數。
         ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    
    2.5 準備配置環境。
          ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);
       2.5.1 獲取或建立配置環境
         ConfigurableEnvironment environment = getOrCreateEnvironment();
         (1) 若是environment對象已經存在,則直接返回
         (2) 若是不存在,判斷webEnvironment(web環境)爲true則建立 StandardServletEnvironment對象並返回該對象,不然建立 StandardEnvironment對象並返回。
       2.5.2 設置系統配置參數
         (1) 設置系統資源問題:configurePropertySources(environment, args);
         (2) 獲取激活配置文件:configureProfiles(environment, args);
       2.5.3 執行 SpringApplicationRunListeners listeners.environmentPrepared(environment)方法
         (1) 即執行全部SpringApplicationRunListener listener的environmentPrepared()方法。
       2.5.4 若是當前環境非web環境,則對environment進行一次包裝。
    
    2.6 設置打印banner
         Banner printedBanner = printBanner(environment);
         
    2.7 判斷須要建立的容器類型,並建立context = createApplicationContext();
         2.7.1 判斷須要的容器類型
             contextClass = Class.forName(this.webEnvironment ? DEFAULT_WEB_CONTEXT_CLASS : DEFAULT_CONTEXT_CLASS);
         
         2.7.2 使用反射建立容器並返回
             (ConfigurableApplicationContext) BeanUtils.instantiate(contextClass);
    
    2.8 加載失敗解析器
         2.8.1 到classpath中 META-INF/spring.factories文件獲取 , 並加載類文件並建立實例對象,返回 List<FailureAnalyzer> analyzers;
             loadFailureAnalyzers(this.classLoader);
         
         2.8.2 準失敗分析器, 如何分析器實現了BeanFactoryAware接口,則執行setBeanFactory操做。
             (1) prepareFailureAnalyzers.prepareFailureAnalyzers(this.analyzers, context);
             (2) ((BeanFactoryAware) analyzer).setBeanFactory(context.getBeanFactory());
    
    2.9 準備容器
         prepareContext(context, environment, listeners, applicationArguments, printedBanner);
         2.9.1 設置容器環境變量
              context.setEnvironment(environment);
             
         2.9.2 設置容器中BeanName解析器,資源加載器
              postProcessApplicationContext(context);
             
         2.9.3 執行ApplicationContextInitializer中的initialize(context)方法    
              applyInitializers(context);
                 initializer.initialize(context);
                 
         2.9.4 執行SpringApplicationRunListener的 contextPrepared(context)方法
              listeners.contextPrepared(context);
             
         2.9.5 向容器設置springApplicationArguments對象實例。
              context.getBeanFactory().registerSingleton("springApplicationArguments",applicationArguments);
             
         2.9.6 向容器設置banner
              context.getBeanFactory().registerSingleton("springBootBanner", printedBanner);
             
         2.9.7 設置beanDefination加載器beanDefinationLoader,並解析加載建立bean對象到容器
             load(context, sources.toArray(new Object[sources.size()]));
             
         2.9.8  執行SpringApplicationRunListener的 contextLoaded(context)方法
              listeners.contextLoaded(context);
 
       2.9.9 刷新容器(後續專門解析)
             refreshContext(context);
     包括加載Beandefination, Beanfactorypostprocess,Beanpostprocess,實現相關接口方法的執行,bean的實例化, bean對象的包裝等操做。返回即爲裝滿應用對象的beanFactory.
             
         2.9.10 容器加載啓動完成,執行runner接口的實現類。
             afterRefresh(context, applicationArguments);
                  callRunners(context, args);
         
         2.9.11 執行SpringApplicationRunListener的 finished(context)方法
              listeners.finished(context);
             
         完成,返回容器。   
相關文章
相關標籤/搜索