springBoot的工做機制--springBoot揭祕

文章目錄
一、@SpringBootApplication -- SpringBoot的核心註解
二、SpringApplication的執行流程
三、SpringApplication的擴展點web

一、@SpringBootApplication -- SpringBoot的核心註解
@SpringBootApplication 內含3個子註解:spring

1.一、@Configuration
該註解用於JavaConfig中,被該註解標註的表示,該類是個配置類。app

1.二、@ComponentScan
自動掃描註解,掃描路徑下的組件或者Beanide

1.3@EnableAutoConfiguration
@EnableAutoConfiguration是個複合註解,源代碼以下spring-boot

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

@EnableAutoConfiguration 最關鍵的是@Import({EnableAUtoConfigurationImportSelector.class}) 註解。
該註解的功能是幫助SpringBoot應用將全部符合條件的@Configuration配置都加載到當前SpringBoot應用spa

1.4自動配置的幕後英雄:SpringFactoriesLoader
該類的做用是加載SpringBoot應用下META-INF/spring.factories配置文件。該配置文件是一個Properties文件。
在spring-boot 和 spring-boot-autoconfig 的META-INF/spring.factories中定義了自動配置的類code

1.5@EnableAutoConfiguration綜述
經過1.三、1.4的描述。@EnableAutoConfiguration的做用能夠描述爲:從classpath下搜尋全部的META-INF/spring.factories配置文件,並將EnableAutoConfiguration對應的配置項經過反射實例化爲對應標註了@Configuration的IoC容器配置類,而後彙總爲一個並加載到IoC容器中blog

二、SpringApplication的執行流程事件

2.一、SpringApplication在實例化以前
2.1.一、SpringApplication在實例化以前會根據你的應用決定建立web類型或者是標準的ApllicationContext
2.1.二、使用SpringFactoriesLoader在classpath下查找並加載全部可用的ApplicationContextInitializer
2.1.三、使用SpringFactoriesLoader在classpath下查找並加載全部可用的ApplicationListener圖片

2.二、SpringApplication實例化完成並設置以後
一、經過SpringFactoriesLoader加載SpringApplicationRunListener(建立監聽器)
二、建立應用須要的Environment(建立應用所需環境)
三、Environment建立完畢,SpringApplicationRunListner調用environmentPrepared()。(通知完畢)
四、根據當前應用建立ApplicationContext
五、調用ApplicationContextInitialzer,對ApplicationContext進一步處理(進一步處理)
六、處理完畢,SpringApplicationRunListner調用contextPrepared().(通知完畢)
七、將以前經過@EnableAutoConfiguration獲取的全部配置以及其餘形式的IoC容器配置加載到已經準備完畢的ApplicationContex
八、SpringApplicationRunListener調用contextLoader()。(通知完畢)
九、調用ApplicationContext的refresh()。完成IoC容器能夠的最後一道程序
十、調用SpringApplicationRunListener的finish()。(通知完成)

圖片描述

三、SpringApplication的擴展點

一、SpringApplicationRunListner(事件通知的監聽者)
實現請參考-->默認實現類--EventPublishingRunListener

二、ApplicationListener(監聽某類事件的發生)
Demo:

public class Listener implements ApplicationListener<ContextRefreshEvent> {
     @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
    }
}

三、ApplicationContextInitializer(進一步處理ApplicationContext)
Demo

public class Demo implements ApplicationContextInitializer {
    @Override
    public void initialize(ConfigurableApplictionContext application)
}

四、CommandLineRunnerCommandLineRunner的執行點在main方法執行完成以前最後一步SpringBoot中的全部CommandLineRunner都會被加載執行CommandLinerRunner 最好使用@Ordered註解標註順序

相關文章
相關標籤/搜索