江帥帥:精通 Spring Boot 系列 02
1 @SpringBootApplication 註解
Spring Boot 的啟動類,也就是入口類,需要使用 @SpringBootApplication 註解來標註。在啟動類中,我們的 main 方法就是 Java 應用程式的入口方法。
@SpringBootApplication 是一個組合註解,具體原始碼如下:
其中,比較重要的三個註解是:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
2 @SpringBootConfiguration 註解
主要是負責 Spring Boot 應用配置相關的註解,它也是組合註解,具體原始碼如下:
透過原始碼,可以看到它也使用了 @Configuration 註解,它們兩個都是將當前類標註為配置類,能將類中使用 @Bean 註解標記的方法對應的例項注入到 Spring 容器中,那例項名就是方法名。
另外在 @Configuration 註解原始碼中,還看到有一個 @Component 註解,做了再次封裝,主要是把普通 POJO 例項化到 Spring 容器中。具體原始碼如下:
所以,更推薦大家在 Spring Boot 應用中使用 @SpringBootConfiguration。
3 @EnableAutoConfiguration 註解
主要用來啟動自動配置,Spring Boot 就能夠根據依賴資訊自動實現應用的相關配置,總體分為兩個部分:一是收集所有 spring.factories 中EnableAutoConfiguration 相關 bean 的類,二是將得到的類註冊到 Spring 容器中。將符合的配置都載入到 IoC 容器中。具體原始碼如下:
元件呼叫關係圖,具體如下:
這張圖,怎麼去理解呢?其實是這樣的,涉及到了 BeanFactory 的建立。Spring 框架中會呼叫 ApplicationContext 的 refresh 方法來啟動 Spring 容器,然後就會建立 BeanFactory,接著掃描各種包,讀取使用到了 @Configuration、@Import、@SpringBootApplication 等註解標註的類,然後生成 BeanDefinition 最終註冊到 BeanFactory 中。
然後就交給 BeanFactoryPostProcessor 來執行,BeanFactory 後置處理器會處理 BeanDefinition,比如在 BeanFactoryPostProcessor 介面中,提供了 postProcessBeanFactory 方法來接收 ConfigurableListableBeanFactory 物件來處理。具體原始碼如下:
其他類似 @Configuration 等配置性質的註解,就讓 ConfigurationClassPostProcessor 來處理。
上面的 ConfigurationClassPostProcessor 主要是 BeanFactoryPostProcessor 介面的實現類,主要是想從 BeanFactory 中獲取所有 BeanDefinition 列表,遍歷出那些使用了 @Configuration、@Import 等配置性質註解標註的類所對應的 BeanDefintion,然後進行註冊。具體原始碼如下:
具體,我們還可以去看看它的 parse 方法是如何處理的,它會去解析註解。
看到最後的 deferredImportSelectorHandler,這個內部類的裡面有一個 deferredImportSelectors 集合,主要是用來新增 AutoConfigurationImportSelector。這個內部私有類,主要維護了一個型別為DeferredImportSelectorHolder 的 deferredImportSelectors 列表。這最後一句程式碼,就是處理完其他BeanDefinitions 後呼叫 process 方法。
再接著來看 process 方法,它負責自動配置類匯入的內部實現,具體原始碼如下:
這個方法,需要這麼來理解:
首先,DeferredImportSelector 它會去從 spring-boot-autoconfigure 包路徑下的 META-INF/spring.factories 檔案中找到 EnableAutoConfiguration 作為 key,然後獲取對應的自動配置類列表。
第二步,在裡面透過 key 即可找到對應需要自動配置的類。接著會進行遍歷所有類名,載入和匯入對應的配置類。
大致的思路是會先建立一個 ConfigurationClass 的物件,它會包含當前這個配置類,然後傳進被呼叫的 doProcessConfigurationClass 方法中,然後處理該類包含的註解。如果是 @Import 註解,則會放在 processImports 方法中進行處理。
再具體講,就是那些非 ImportSelector 介面實現類和ImportBeanDefinitionRegistrar 介面實現類的配置類,就會呼叫processConfigurationClass 方法來處理該自動配置類上面的其他註解,並將該自動配置類內部使用了 @Bean 註解的所有方法,條件化生成 bean 並註冊到 Spring 容器,那最終就可以提供特定功能元件的預設實現,也就實現了 SpringBoot 的自動配置功能,在你使用的時候,比如直接透過 @Autowried 註解就可以注入某個功能元件,而不需要顯示配置。
具體原始碼如下(這裡不貼全部原始碼了,大家可以看看它給出的註釋就明白了):
4 獲取 Bean 類資訊
我們可以來研究下這個註解,瞭解它是如何載入配置的。在原始碼中,可以看到 @Import({AutoConfigurationImportSelector.class}) 註解,匯入的就是自動配置選擇器。
AutoConfigurationImportSelector 選擇器是 DeferredImportSelector 介面的實現類,會在 BeanFactory 中對所有 BeanDefinition 處理後執行來進行 SpringBoot 自動配置類的載入、匯入操作等,並基於 @Conditional 條件化配置來決定是否將該配置類內部定義的 Bean 註冊到 Spring 容器。具體原始碼如下:
在 AutoConfigurationImportSelector.class 中,可以看到實現了一個 selectImports 方法,用來匯出 Configuration。方法中呼叫了 getAutoConfigurationEntry 方法,獲取 bean 類資訊。具體原始碼如下:
繼續來看 getAutoConfigurationEntry 方法,具體原始碼如下:
再接著來看呼叫的 getCandidateConfigurations 方法,它主要是想獲取所有對應的配置,它裡面呼叫了 loadFactoryNames 方法,目的是要想載入 spring.factories 檔案。它們的原始碼具體如下:
loadFactoryNames 方法的具體原始碼如下:
接著就在 loadSpringFactories 方法中,找到所有的 spring.factories 配置資訊,然後全部返回。具體原始碼如下:
來源:奈學開發者社群
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2698524/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 江帥帥:精通 Spring Boot 系列 01Spring Boot
- 江帥帥:精通 Spring Boot 系列 03Spring Boot
- 江帥帥:精通 Spring Boot 系列 04Spring Boot
- 江帥帥:精通 Spring Boot 系列 05Spring Boot
- 江帥帥:精通 Spring Boot 系列 06Spring Boot
- 艦隊統帥
- 蘇嵌/楊帥/0711
- 蘇嵌//楊帥/2018.7.10
- L1-020 帥到沒朋友
- 帥初的“羅生門”漩渦
- 王廣帥IM工程執行記錄
- Spring Boot系列十九 Spring boot整合 swaggerSpring BootSwagger
- Linux安裝Nginx 作者:哇塞大嘴好帥LinuxNginx
- 超帥氣的網站-我愛冷笑話網站
- Spring Boot系列(一):Spring Boot快速開始Spring Boot
- Spring Boot系列(四):Spring Boot原始碼解析Spring Boot原始碼
- Spring Boot系列(一):Spring Boot 入門篇Spring Boot
- Spring Boot2 系列教程(三)理解 Spring BootSpring Boot
- 可能輕微捯飭下,IT 男就能變帥了
- L1-020 帥到沒朋友 分數 20
- 換一個帥一點姿勢實現DexHunter
- 逝去的 2020,帥地期待過,也曾迷茫過...
- 這樣寫程式碼,真是帥到沒有朋友
- Spring Boot系列(三):Spring Boot整合Mybatis原始碼解析Spring BootMyBatis原始碼
- 酷帥吊炸天的 Pandas 常用操作命令彙總
- WFee路由器近日流出諜照,外形帥到沒朋友!路由器
- 手撕redis分散式鎖,隔壁張小帥都看懂了!Redis分散式
- 技術向上,雪坡向下:拼多多的“新帥”與新路
- Spring Boot乾貨系列:(十二)Spring Boot使用單元測試Spring Boot
- Spring Boot系列(四) Spring Cloud 之 Config ClientSpring BootCloudclient
- 史丹佛AI實驗室換帥!Christopher Manning接替李飛飛AI
- Spring Boot系列筆記--整合RedisSpring Boot筆記Redis
- Spring Boot乾貨系列:(十三)Spring Boot全域性異常處理整理Spring Boot
- Spring Boot系列十七 Spring Boot 整合 websocket,使用RabbitMQ做為訊息代理Spring BootWebMQ
- Spring Boot系列十六 WebSocket簡介和spring boot整合簡單訊息代理Spring BootWeb
- 最近爆火的帥小夥丁真在AI面前顏值多少分?AI
- Spring Boot系列之一:如何快速熟悉Spring技術棧Spring Boot
- 從零開始學Spring Boot系列-SpringApplicationSpring BootAPP