Spring Boot啟動流程和自動配置原理
阿新 • • 發佈:2020-06-24
Java程式設計師應該都知道,每個Spring Boot都有一個啟動類,Spring Boot的啟動就是執行的該類的main方法。如下圖,main方法中就是執行SpringApplication.run方法。
啟動流程
先總結一下Spring Boot啟動流程。
- SpringApplication.run中執行了兩步操作,先封裝了一個SpringApplication的例項,再執行該例項的過載run方法
- SpringApplication封裝例項時,讀取了classpath下所有的
MTEA-INF/spring.factories
xml配置檔案的ApplicationContextInitializer(容器初始化器)還有ApplicaiontListener(偵聽器),將這兩者封裝到SpringApplication例項中 - 執行SpringApplication例項的run方法
- run方法中預設初始化了Annotation配置的容器AnnotationConfigApplicationContext
- 執行上面ApplicationContextInitializer的initial方法
- 然後載入Bean到容器中
Spring Boot自動化配置
我們知道,使用Maven座標匯入開發所需的jar包後,同時一些預設配置也會生效。那麼Spring Boot又是怎麼為這些jar包配置預設值的呢? 答案就在Spring Boot的啟動類上的註解@SpringBootApplication中。
@SpringBootApplication主要由三個註解構成:@SpringBootConfiguration
@EnableAutoConfiguration
、@ComponentScan
@EnableAutoConfiguration
底層是由兩個註解組成,@AutoConfigurationPackage
、@Import(AutoConfigurationImportSelector.class)
@Import(AutoConfigurationImportSelector.class)
自動配置的奧妙就在這裡啦,這個類匯入了很多自動配置類,debug一下可以發現,其讀取的是classpath下的META-INF/spring.factories
下的自動配置類
自動配置類如下:
總結
Spring Boot通過主啟動類上的@SpringBootApplication中的@EnableAutoConfiguration讀取了類路徑下的META-INF/spring.factories
下EnableAutoConfiguration的配置類,但是這些配置類使用了@ConditionalOnClass,需滿足一定的條件才會啟用配置,這些配置類寫入了預設的配置。