SpringBoot自動配置與啟動流程詳細分析
一、自動配置
主啟動類
//@SpringBootApplication 來標注一個主程序類 //說明這是一個Spring Boot應用 @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { //以為是啟動了一個方法,沒想到啟動了一個服務 SpringApplication.run(SpringbootApplication.class, args); } }
@SpringBootApplocation注解內部
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { // ...... }
1. @ComponentScan
這個注解在Spring中很重要,它對應XML配置中的元素。
作用:自動掃描并加載符合條件的組件或者bean,將這個bean定義加載到IOC容器中。
2. @SpringBootConfiguration
作用:SpringBoot的配置類,標注在某個類上,表示這是一個SpringBoot的配置類;
@Configuration 作用:允許在上下文中注冊額外的bean或倒入其他配置類
//@SpringBootConfiguration注解內部 //這里的 @Configuration,說明這是一個配置類 ,配置類就是對應Spring的xml 配置文件; @Configuration public @interface SpringBootConfiguration {} //里面的 @Component 這就說明,啟動類本身也是Spring中的一個組件而已,負責啟動應用 @Component public @interface Configuration {}
3. @EnableAutoConfigeration
作用:啟用SpringBoot的自動配置機制
import java.lang.annotation. Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.context.annotation.Import; @Target({ElementTypeTYPE}) @Retention(RetentionPolicy.RUNTIME)@Documented @Inherited @AutoconfigurationPackage @Import( {AutoconfigurationImportselector.class}) public @interface EnableAutoconfiguration{ string ENABLED_OVERRIDE_PROPERTY ="spring.boot.enableautoconfiguration" ; class<?>[]exclude() default {}; string[ ] excludeName( ) default {}; }
@AutoConfigurationPackage :自動配置包
//AutoConfigurationPackage的子注解 //Registrar.class 作用:將主啟動類的所在包及包下面所有子包里面的所有組件掃描到Spring容器 @Import({Registrar.class}) public @interface AutoConfigurationPackage { }
@EnableAutoConfigeration 注解通過Spring提供的 @Import 注解導入了 AutoConfigurationImportSelector 類; AutoConfigurationImportSelector 類中 getCandidateConfigurations 方法會將所有自動配置類的信息以List的形式返回,這些配置信息會被Spring容器作Bean來管理。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }
4. @Condition
在Spring 4.0 增加的條件判斷功能,通過這個可以功能可以實現(xiàn)選擇性的創(chuàng)建 Bean 操作。
- ConditionalOnProperty:判斷配置文件中是否有對應屬性和值才初始化Bean
- ConditionalOnClass:判斷環(huán)境中是否有對應字節(jié)碼文件才初始化Bean
- ConditionalOnMissingBean:判斷環(huán)境中沒有對應Bean才初始化Bean
- ConditionalOnBean:判斷環(huán)境中有對應Bean才初始化Bean
以上注解在springBoot-autoconfigure的condition包下。
總結原理
- @EnableAutoConfiguration 注解內部使用 @Import(AutoConfigurationImportSelector.class)來加載配置類;
- 配置文件位置:META-INF/spring.factories,該配置文件中定義了大量的配置類,當 SpringBoot 應用啟動時,會自動加載這些配置類,初始化Bean;
- 并不是所有的Bean都會被初始化,在配置類中使用Condition來加載滿足條件的Bean。
啟動流程
- 基于SpringBoot開發(fā)的項目中都會有一個@SpringBootApplication注解配置的啟動類,啟動類中會有一個
main()
方法作為啟動入口,main()
方法中調用SpringApplication.run()
,開始啟動整個SpringBoot應用程序; - 在
SpringApplication.run()
方法中,首先進行初始化,創(chuàng)建SpringApplication對象,通過它的構造方法,完成初始化,讀取自動配置核心類; - 通過執(zhí)行SpringApplication對象的
run()
方法,完成SpringBoot應用程序的啟動邏輯:啟動流程的監(jiān)聽、配置環(huán)境、打印啟動Banner、創(chuàng)建Spring容器、記錄啟動時間、執(zhí)行Runner(ApplicationRunner和CommandLineRunner)等啟動步驟。
到此這篇關于SpringBoot自動配置與啟動流程詳細分析的文章就介紹到這了,更多相關SpringBoot自動配置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
深入分析@Resource和@Autowired注解區(qū)別
這篇文章主要為大家介紹了深入分析@Resource和@Autowired注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04Spring Cloud Zuul集成Swagger實現(xiàn)過程解析
這篇文章主要介紹了Spring Cloud Zuul集成Swagger實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11SpringBoot結合FreeMarker視圖渲染的實現(xiàn)
FreeMarker它允許開發(fā)人員使用模板和數(shù)據(jù)來生成輸出文本,如HTML網(wǎng)頁、電子郵件、配置文件和源代碼等,本文主要介紹了SpringBoot結合FreeMarker視圖渲染的實現(xiàn),感興趣的可以了解一下2024-03-03詳解基于Spring Cloud幾行配置完成單點登錄開發(fā)
這篇文章主要介紹了詳解基于Spring Cloud幾行配置完成單點登錄開發(fā),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群的方案
Kubernetes是一個開源的容器編排平臺,可以自動化在部署、管理和擴展容器化應用過程中涉及的許多手動操作,這篇文章主要介紹了Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群,需要的朋友可以參考下2024-08-08