對技術的探索,一切源于好奇心,保持好奇心,才能讓人更年輕。
至今,我們已經有了很多創建SpringBoot項目的經驗,比如我們要創建一個支持web開發的項目,我們只需要引入web-starter模塊即可。
那么,SpringBoot為什么這么神奇?引入的依賴變少了,配置文件也不見了,但項目卻可以正常運行。下面我們一起來探究這背后的邏輯:
1,為什么依賴的依賴變少了?SpringBoot是如何管理這些依賴的?
我們分兩個點來看起
1.1 從pom文件出發
首先,是有一個父工程的引用

我們繼續往里面跟蹤,發現父工程又依賴于另一個父工程

繼續跟蹤,發現這是一個pom工程,統一控制版本

定義了一堆第三方jar包的版本

結論:
所有我們使用了SpringBoot之后,由于父工程有對版本的統一控制,所以大部分第三方包,我們無需關注版本,個別沒有納入SpringBoot管理的,才需要設置版本號
1.2 SpringBoot將所有的常見開發功能,分成了一個個場景啟動器(starter),這樣我們需要開發什么功能,就導入什么場景啟動器依賴即可。
比如,我們現在要開發web項目,所以我們導入了spring-boot-starter-web

我們來跟蹤看看,內部也復用一些starter

還有Springweb和SpringMVC,這也就是為什么,我們就可以開發SpringWeb程序的原因

結論:
- 大家會發現,SpringBoot是通過定義各種各樣的Starter來管理這些依賴的
- 比如,我們需要開發web的功能,那么引入spring-boot-starter-web
- 比如,我們需要開發模板頁的功能,那么引入spring-boot-starter-thymeleaf
- 我們需要整合redis,那么引入spring-boot-starter-data-redis
- 我們需要整合amqp,實現異步消息通信機制,那么引入spring-boot-starter-amqp
- 等等,就是這么方便
2,為什么我們不需要配置?
我們來看看SpringBoot的啟動類代碼,除了一個關鍵的注解,其他都是普通的類和main方法定義

那么,我們來觀察下這個注解背后的東西,發現,這個注解是一個復合注解,包含了很多的信息

其他注解都是一個注解的常規配置,所以關鍵看圈中的這兩個
我們來分析第一個關鍵注解:@SpringBootConfiguration
我們可以看到,內部是包含了@Configuration,這是Spring定義配置類的注解
而@Configuration實際上就是一個@Component,表示一個受Spring管理的組件

結論:@SpringBootConfiguration這個注解只是更好區分這是SpringBoot的配置注解,本質還是用了Spring提供的@Configuration注解
我們再來探討下一個注解:@EnableAutoConfiguration
這個注解的作用是告訴SpringBoot開啟自動配置功能,這樣就減少了我們的配置
那么具體是怎么實現自動配置的?
我們先來觀察這個注解背后的內容

所以,又到了分析圈中的兩個注解了
先來分析@AutoConfigurationPackage
觀察其內部實現,內部是采用了@Import,來給容器導入一個Registrar組件

所以,我們繼續往下跟蹤,來看Registrar內部是什么情況?

我們可以跟蹤源碼看看這段是什么信息

結論:
通過源碼跟蹤,我們知道,程序運行到這里,會去加載啟動類所在包下面的所有類
這就是為什么,默認情況下,我們要求定義的類,比如controller,service必須在啟動類的同級目錄或子級目錄的原因
再來分析@Import(AutoConfigurationImportSelector.class)
這個的關鍵是來看AutoConfigurationImportSelector.class內部的細節
在這個類的內部,有一個關鍵的方法,我們可以調試來看看結果

發現默認加載了好多的自動配置類,這些自動配置類,會自動給我們加載每個場景所需的所有組件,并配置好這些組件,這樣就省去了很多的配置

好了,今天就寫到這,祝大家周末愉快,每天都能增值一點點!
有更多的時間去做自己喜歡的事。