SpringBoot自動配置特點與原理詳細分析
一、SpringBoot是什麼
Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。
在Spring框架這個大傢族中,產生瞭很多衍生框架,比如 Spring、SpringMvc框架等,Spring的核心內容在於控制反轉(IOC)和依賴註入(DI),所謂控制反轉並非是一種技術,而是一種思想,在操作方面是指在spring配置文件中創建<bean>,依賴註入即為由spring容器為應用程序的某個對象提供資源,比如 引用對象、常量數據等。
在Spring框架這個大傢族中,產生瞭很多衍生框架,比如 Spring、SpringMvc框架等,Spring的核心內容在於控制反轉(IOC)和依賴註入(DI),所謂控制反轉並非是一種技術,而是一種思想,在操作方面是指在spring配置文件中創建<bean>,依賴註入即為由spring容器為應用程序的某個對象提供資源,比如 引用對象、常量數據等。
二、SpringBoot的特點(核心功能)
- 可獨立運行的Spring項目:Spring Boot可以以jar包的形式獨立運行。
- 內嵌的Servlet容器:Spring Boot可以選擇內嵌Tomcat、Jetty或者Undertow,無須以war包形式部署項目。
- 簡化的Maven配置:Spring提供推薦的基礎 POM 文件來簡化Maven 配置。
- 自動配置Spring:Spring Boot會根據項目依賴來自動配置Spring 框架,極大地減少項目要使用的配置。
- 提供生產就緒型功能:提供可以直接在生產環境中使用的功能,如性能指標、應用信息和應用健康檢查。
- 無代碼生成和xml配置:Spring Boot不生成代碼。完全不需要任何xml配置即可實現Spring的所有配置。
SpringBoot最明顯的特點是,讓文件配置變的相當簡單、讓應用部署變的簡單(SpringBoot內置服務器,並裝備啟動類代碼),可以快速開啟一個Web容器進行開發。
三、SpringBoot的自動配置原理
Spring Boot的啟動類上有一個@SpringBootApplication註解,這個註解是Spring Boot項目必不可少的註解。
1. @SpringBootApplication
作用:SpringBoot的核心註解,標註在某個類上說明這個類是SpringBoot的主配置類 , SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用
@SpringBootApplication public class Springboot01Application { public static void main(String[] args) { SpringApplication.run(Springboot01Application.class, args); } }
它的本質是一個組合註解,我們點進去查看該類的元信息主要包含3個註解:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} )
2. @SpringBootConfiguration
作用:SpringBoot的配置類 ,標註在某個類上 , 表示這是一個SpringBoot的配置類;我們繼續進去這個註解查看源碼:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @Indexed public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; }
@Configuration標註在某個類上,表示這是一個 springboot的配置類。可以向容器中註入組件。
3. @EnableAutoConfiguration
作用:開啟自動配置功能
以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration告訴SpringBoot開啟自動配置功能;這樣自動配置才能生效;
點進註解接續查看:
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自動配置包
@Import({AutoConfigurationImportSelector.class}):Spring底層註解@import , 給容器中導入一個組件,導入的組件由AutoConfigurationPackages.Registrar.class這個類來指定
①利用getAutoConfigurationEntry(annotationMetadata);給容器中批量導入一些組件;
②調用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)獲取到所有需要導入到容器中的配置類;
③利用工廠加載 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的組件;
④從META-INF/spring.factories位置來加載一個文件。默認掃描我們當前系統裡面所有META-INF/spring.factories位置的文件。
4. @ComponentScan
作用:自動掃描組件,默認掃描該類所在包及其子包下所有帶有指定註解的類,將它們自動裝配到bean容器中,會被自動裝配的註解包括@Controller、@Service、@Component、@Repository等。也可以指定掃描路徑。
四、核心原理圖
簡單來說,Spring Boot通過@EnableAutoConfiguration註解開啟自動配置,對jar包下的spring.factories文件進行掃描,這個文件中包含瞭可以進行自動配置的類,當滿足@Condition註解指定的條件時,便在依賴的支持下進行實例化,註冊到Spring容器中。
五、常用的Conditional註解
在加載自動配置類的時候,並不是將spring.factories的配置全部加載進來,而是通過@Conditional等註解的判斷進行動態加載;
@Conditional其實是spring底層註解,意思就是根據不同的條件,來進行自己不同的條件判斷,如果滿足指定的條件,那麼配置類裡邊的配置才會生效;
常用的Conditional註解:
@ConditionalOnClass : classpath中存在該類時起效
@ConditionalOnMissingClass : classpath中不存在該類時起效
@ConditionalOnBean : DI容器中存在該類型Bean時起效
@ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效
@ConditionalOnSingleCandidate : DI容器中該類型Bean隻有一個或@Primary的隻有一個時起效
@ConditionalOnExpression : SpEL表達式結果為true時
@ConditionalOnProperty : 參數設置或者值一致時起效
@ConditionalOnResource : 指定的文件存在時起效
@ConditionalOnJndi : 指定的JNDI存在時起效
@ConditionalOnJava : 指定的Java版本存在時起效
@ConditionalOnWebApplication : Web應用環境下起效
@ConditionalOnNotWebApplication : 非Web應用環境下起效
到此這篇關於SpringBoot自動配置特點與原理詳細分析的文章就介紹到這瞭,更多相關SpringBoot自動配置內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot自動配置與啟動流程詳細分析
- SpringBoot自動配置原理分析
- SpringBoot自動配置原理,你真的懂嗎?(簡單易懂)
- Springboot @Configuration與自動配置詳解
- 詳解SpringBoot自動配置源碼