011.環境準備
使用IDEA Spring Initializr快速創建一個Spring Boot項目
添加一個Controller類
主配置類如下
022.註解分析
Spring Boot規定,項目的主配置類必須放在最外層包,也就是說,所有的類都必須放在主配置類的同級包或者子包裡,這麼做的用意是什麼?我們點開@SpringBootApplication註解慢慢分析(下面代碼中省略元註解)...
@SpringBootApplication內部標註了三個註解:
@SpringBootConfiguration進入源碼中可以看見,@SpringBootConfiguration其實就是Spring中的@Configuration,用於標註配置類
@ComponentScan這個註解也是Spring中的,它用來將指定包下需要裝配的組件註冊到容器中@EnableAutoConfiguration接下來才是今天的重頭戲,Spring Boot自動配置的主角!
033.自動裝配的主角
進入@EnableAutoConfiguration源碼你會發現這個註解中標註了兩個註解@AutoConfigurationPackage和@Import
(1)、@AutoConfigurationPackage
點進該註解
在點進Register,這是一個靜態內部類
我們在第一個方法處打一個斷點debug一下,發現new PackageImport(metadata).getPackageName()的結果其實就是一個包名,這時我們很容易的可以想到,這個包就是Spring Boot主配置類所在的包
再看一眼metadata,果然,就是主配置類
因此,這個註解的作用就是將主配置類所在的包作為自動配置包進行管理
(2)、@Import(AutoConfigurationImportSelector.class)
@Import的作用就是導入一個類到IOC容器,我們先來看一下導入的這個類:自動配置導入選擇器源碼裡有一個方法selectImports,選擇導入
在getCandidateConfigurations方法處打一個斷點,發現configurations的結果是所有的xxxAtuoConfiguration類,一共124個,請記住這個數字。
那麼這些自動配置類是如何獲取的呢,從哪裡獲取的呢?
我們繼續點進getCandidateConfigurations,獲取候選的配置
打開spring-boot-autoconfigure-2.2.4.RELEASE.jar/META-INF/spring.factories,文件部分類容如下,你可以點進去看看第22~145行,確實是124個全類名
04
加載了這麼多類我們又不一定全都用得到,設計師肯定會想辦法讓類在我們需要的時候才生效,我們隨便點進一個類,可以看到一片飄紅,因為我們並沒有引入RabbitMQ相關依賴,再看一個註解ConditionalOnClass,意思就是存在某個指定的類才生效,類似的註解還有很多,都是@ConditionaOn xxx,在一定條件下類才會生效。
由於引入了web模塊,WebMvcAutoConfiguration正常顯示