SpringBoot 約定大於配置 的功力讓咱們如沐春風,在我以前寫的文章《從SpringBoot到SpringMVC》 也對比過 SpringBoot 和 SpringMVC 這兩個框架,不過最終 SpringBoot 以超高的代碼信噪比 和 易上手性 讓咱們映像頗深。spring
但歸根結底,不論 SpringBoot 或者 SpringMVC 應用本質上依然是一個基於 Spring的應用,只不過在後者臉龐上蒙上了一層神祕的面紗而已!編程
回到 SpringBoot 的話題,咱們在開發基於 SpringBoot 的應用時,用到了一些新的註解和類,正式因爲其存在,才讓JavaEE的開發如魚得水。這其中咱們用的最多的註解之一,當屬 SpringBoot 應用啓動類上的 @SpringBootApplication 註解了c#
本文就來看看它究竟是個啥!服務器
注: 本文首發於 My 公衆號 CodeSheep ,可 長按 或 掃描 下面的 當心心 來訂閱 ↓ ↓ ↓框架
@SpringBootApplication註解其實是SpringBoot提供的一個複合註解,咱們來看一看其源碼:微服務
@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) }) public @interface SpringBootApplication { ... }
看得很清楚,其是一個合成體,但其中最重要的三個註解分別是:學習
@SpringBootConfiguration搜索引擎
@EnableAutoConfiguration編碼
@ComponentScan3d
咱們不妨稱其爲 「 三體結構 」 吧!
若是咱們不怕麻煩,在 SpringBoot 應用的啓動類上用這個三個註解代替@SpringBootApplication 註解發現也是沒問題的:
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan public class TestSpringBootApplication { ... }
下面分別剖析一下這三個註解的功效!
看代碼吧,代碼裏是這樣寫的:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
這說明 @SpringBootConfiguration 也是來源於 @Configuration,兩者功能都是將當前類標註爲配置類,並將當前類裏以 @Bean 註解標記的方法的實例注入到srping容器中,實例名即爲方法名。
至於@Configuration,我想在非SpringBoot時代你們應該不陌生吧,做用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置類所使用。
到目前來看,好像尚未什麼新東西!!!
再繼續看代碼,代碼是這樣的:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { ... }
@EnableAutoConfiguration 註解啓用自動配置,其能夠幫助 SpringBoot 應用將全部符合條件的 @Configuration 配置都加載到當前 IoC 容器之中,能夠簡要用圖形示意以下:
接下來咱們對照源碼,來解釋一下這個流程:
而spring.factories 文件裏關於 EnableAutoConfiguration 的配置其實就是一個鍵值對結構,樣子大概長下面這樣:
說了這麼多,若是從稍微宏觀一點的角度 歸納總結 上述這一過程那就是:
從 ClassPath下掃描全部的 META-INF/spring.factories 配置文件,並將spring.factories 文件中的 EnableAutoConfiguration 對應的配置項經過反射機制實例化爲對應標註了 @Configuration 的形式的IoC容器配置類,而後注入IoC容器。
@ComponentScan 對應於XML配置形式中的 context:component-scan,用於將一些標註了特定註解的bean定義批量採集註冊到Spring的IoC容器之中,這些特定的註解大體包括:
等等
對於該註解,還能夠經過 basePackages 屬性來更細粒度的控制該註解的自動掃描範圍,好比:
@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})
可見 這個註解也並非什麼新東西!
因爲能力有限,如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流!
做者更多的SpringBt實踐文章在此:
若是有興趣,也能夠抽點時間看看做者一些關於容器化、微服務化方面的文章:
可 長按 或 掃描 下面的 當心心 來訂閱 CodeSheep,獲取更多 務實、能看懂、可復現的 原創文 ↓↓↓