SpringBoot 自動配置原理
基礎知識
Bean掃描
我們在學習 Spring 的時候,如果要把標注一下注解的類掃描進 IOC 容器 @Controller,@Service,@Mapper,是需要通過一下兩種方式實現的,但是我們在 SpringBoot 工程中并沒有編寫有關這個的代碼啊?
- 其實這部分代碼是存在的,只是 SpringBoot 已經幫我們寫好了,只要遵循相關約定就能實現 Bean 掃描功能,我們可以點開主啟動類上面的注解 @SpringBootApplication。
Bean注冊
我們之前 Spring 學過使用一下注解可以將自己寫的 Bean (Controller) 注冊道 IOC 容器內。但是對于第三方Jar 包上(只讀文件,不能在他上面添加注解)的 Bean 我們如何注冊呢 ? 一共有兩種方式:通過@Bean 注解,@Import 注解
- 通過 @Bean 注解
該注解可以把方法的返回值,作為 Bean 對象注冊進 IOC 容器中,我下面用 SpringBoot 這個 Swagger 的配置類注入并來演示(不懂 Swagger3 沒關系)
- @Import 注解
我們上面演示的是 @configuration 注解在啟動類所在的包下,如果不在呢?這是我們可以使用 @Import 注解,直接將它導入進來。我們一般將他用來導入 配置類,ImportSelector 接口的實現類。
我們觀察上面的導入,有沒有發現一個問題。就是假如我需要導入的配置類有很多,那么全寫在這里面后,代碼是不是會顯得很臃腫,測試就要用到 ImportSelector 了。
編寫 ImportSelector 接口實現類
修改啟動類的導入代碼
進一步優化
上面配置類存放數組內容是寫死的,提高了代碼的耦合性,我們可以把這些內容單獨放進配置文件類,然后利用輸入流逐條獲取出來放進數組
注冊條件
當我們注入 Bean 的時候,如果滿足某種條件時我們才注入不然就不注入,這些內容會在自定義 Starter 時和查看 SpringBoot 源碼時會看到關于這個一共有三個注解可以實現如下
@ConditionalOnProperty 注解介紹
@ConditionalOnMissingBean 注解介紹
@ConditionOnClass 注解介紹
自動配置原理
源碼解析
面試該如何回答
- 在主啟動類上添加了 @SpringBootApplication 注解,該注解組合 @EnableAutoConfiguration 注解,而這個注解又組合了 @Import 注解,導入了 AutoConfigurationImportSelector.class 類,
- 該類實現了 selectImports 方法,這個方法經過層層調用,最終會讀取 META-INF 目錄下的后綴名為 imports 的文件(配置文件,里面存放很多配置類的全類名)
- 讀取到該文件下的全類名后,會先解析注冊條件(@Conditional 及其衍生注解),把滿足條件的 Bean 對象注冊到 IOC 容器中