做爲Spring Boot的精髓,自動配置原理的工做過程每每只有在「面試」的時候才能用得上,可是若是在工做中你可以深刻的理解Spring Boot的自動配置原理,將無往不利。面試
Spring Boot的出現,得益於「習慣優於配置」的理念,沒有繁瑣的配置、難以集成的內容(大多數流行第三方技術都被集成),這是基於Spring 4.x提供的按條件配置Bean的能力。spring
springboot的配置文件 :application.properties 或 application.ymlspringboot
示例:那麼問題來了:這些配置是如何在Spring Boot項目中生效的呢?那麼接下來,就須要聚焦本篇博客的主題:自動配置工做原理或者叫實現方式。app
Spring Boot關於自動配置的源碼在spring-boot-autoconfigure-x.x.x.x.jar中:ide
如圖:Spring Boot的啓動類上有一個@SpringBootApplication註解,這個註解是Spring Boot項目必不可少的註解,也是springboot自動配置的核心spring-boot
1.@Configuration的註解類標識這個類可使用Spring IoC容器做爲bean定義的來源。@Bean註解告訴Spring,一個帶有@Bean的註解方法將返回一個對象,該對象應該被註冊爲在Spring應用程序上下文中的bean。this
二、@EnableAutoConfiguration:可以自動配置spring的上下文,試圖猜想和配置你想要的bean類,一般會自動根據你的類路徑和你的bean定義自動配置。spa
三、@ComponentScan:會自動掃描指定包下的所有標有@Component的類,並註冊成bean,固然包括@Component下的子註解@Service,@Repository,@Controller。@SpringBootApplication是一個複合註解或派生註解,在@SpringBootApplication中有一個註解@EnableAutoConfiguration,翻譯的話就是開啓自動配置 @Configuration //表示這是一個配置類,也能夠給容器中添加組件咱們查看@EnableAutoConfiguration註解 ,會發現他引入了個 類
AutoConfigurationImportSelector.class進入AutoConfigurationImportSelector類中,咱們會發現 有這個方法 如圖翻譯
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; }
出現報錯 從中咱們能夠推出 @EnableAutoConfiguration註解 如何自動裝配了 "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct." 翻譯:在META-INF/spring.factories中找不到自動配置類。若是使用自定義打包,請確保文件正確無誤。orm
在保重咱們找到的了對應的spring.factories 文件打開以後,這個@EnableAutoConfiguration註解經過@SpringBootApplication被間接的標記在了Spring Boot的啓動類上。在SpringApplication.run(...)的內部就會執行selectImports()方法,找到全部JavaConfig自動配置類的全限定名對應的class,而後將全部自動配置類加載到Spring容器中。