SpringBoot起步依賴(lài)和自動(dòng)配置基本介紹
1、起步依賴(lài)
概念
起步依賴(lài)本質(zhì)上是一個(gè)Maven項(xiàng)目對(duì)象模型(Project Object Model,POM),定義了對(duì)其他庫(kù)的傳遞依賴(lài),這些東西加在一起支持某一功能。
簡(jiǎn)單的說(shuō),起步依賴(lài)就是將具備某種功能的坐標(biāo)打包到一起,并提供一些默認(rèn)的功能
例子-搭建Web應(yīng)用
Spring+SpringMVC
我們需要添加許多依賴(lài),還要考慮到不同依賴(lài)之間存在版本沖突的問(wèn)題,一般搭建一個(gè)Web項(xiàng)目時(shí)需要導(dǎo)入以下依賴(lài):
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.3.RELEASE</version> </dependency>
SpringBoot
搭建Web項(xiàng)目只需要導(dǎo)入一個(gè)起步依賴(lài):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>也就是只需要導(dǎo)入一個(gè)名為spring-boot-starter-web 的起步依賴(lài)即可,我們點(diǎn) spring-boot-starter-web 進(jìn)去可以看到,其實(shí)這個(gè)起步依賴(lài)集成了常用的 web 依賴(lài)。
2、自動(dòng)配置
概念
SpringBoot的自動(dòng)配置是一個(gè)運(yùn)行時(shí)(應(yīng)用程序啟動(dòng)時(shí))的過(guò)程,根據(jù)配置,才決定Spring配置應(yīng)該使用哪個(gè),這個(gè)過(guò)程是Spring自動(dòng)完成的。
分析
在SpringBoot中集成了一些常見(jiàn)的容器,或者說(shuō)是組件,例如我們最常用的Tomcat服務(wù)器,所以在做web項(xiàng)目時(shí),不需要再另外部署到Tomcat上,可以直接運(yùn)行,這就需要整個(gè)項(xiàng)目有一個(gè)入口,類(lèi)似于普通java程序中的main方法(其實(shí)就是main方法),這個(gè)入口我們一般用一個(gè)單獨(dú)的類(lèi)來(lái)表示,其中包含一個(gè)main方法,這個(gè)類(lèi)通常稱(chēng)之為SpringBoot的引導(dǎo)類(lèi),SpringBoot入門(mén)程序的引導(dǎo)類(lèi)代碼如下:

@SpringBootConfiguration 和 @ComponentScan 注解。前者實(shí)質(zhì)為 @Configuration 注解,這個(gè)注解相比大家都接觸過(guò),也就是起到聲明這個(gè)類(lèi)為配置類(lèi)的作用,而后者起到開(kāi)啟自動(dòng)掃描組件的作用。
這里需要重點(diǎn)分析的是 @EnableAutoConfiguration 這個(gè)注解,這個(gè)注解的作用是開(kāi)啟 Spring Boot 的自動(dòng)配置功能,我們來(lái)分析一下它是如何開(kāi)啟的,點(diǎn)擊進(jìn)去可以看到:

可以看到這個(gè)注解上邊又有兩個(gè)注解,@AutoConfigurationPackage和@Import,@AutoConfigurationPackage是用來(lái)管理自動(dòng)配置類(lèi)的,可以先不看,先看@Import,這個(gè)注解在Spring純注解配置當(dāng)中也使用過(guò),它的作用是導(dǎo)入另外一個(gè)配置類(lèi),這里導(dǎo)入了一個(gè)叫做AutoConfigurationImportSelector的配置類(lèi),翻譯過(guò)來(lái)就是自動(dòng)配置的導(dǎo)入選擇器,進(jìn)一步挖它的源代碼:
由于這個(gè)類(lèi)內(nèi)容較多,我們只關(guān)心它實(shí)現(xiàn)自動(dòng)配置的步驟,所以我們根據(jù)內(nèi)部調(diào)用關(guān)系一步一步找:

內(nèi)容太多看不懂不要緊,我們只看關(guān)鍵部分,這是我們找到的關(guān)鍵方法,第一個(gè)方法字面意思就是“選擇導(dǎo)入”,它的內(nèi)部又調(diào)用了第二個(gè)關(guān)鍵方法,意為“獲取自動(dòng)配置入口”,在這個(gè)getAutoConfigurationEntry()方法中可以明顯看到configurations這樣的關(guān)鍵字眼(通過(guò)下面的分析可以確定里面裝的是一些配置類(lèi)的全限定類(lèi)名),而且它是一個(gè)字符串類(lèi)型的集合,它來(lái)自于getCandidateConfigurations()方法,所以我們?cè)谶@個(gè)類(lèi)中繼續(xù)往下找這個(gè)方法:

挖到這里,可以看到它還在繼續(xù)調(diào)用其他類(lèi)中的方法,這個(gè)時(shí)候要還想繼續(xù)往下挖可能就有一定難度了,但是在這個(gè)時(shí)候我們可以從下方的message中發(fā)現(xiàn)一點(diǎn)貓膩,里面的META-INF/spring.factories好像看起來(lái)是某個(gè)路徑下的,那么是那個(gè)路徑下呢,我們可以盲猜就是當(dāng)前這個(gè)類(lèi)相關(guān)的某個(gè)路徑,所以我們來(lái)到這個(gè)類(lèi)的最上方看它的全限定包名:

我們可以根據(jù)這個(gè)包名在我們導(dǎo)入的Libraies里面去找這個(gè)包,然后真的找到了這么一個(gè)配置文件:


這個(gè)配置文件里面是一些全限定類(lèi)名,而且每個(gè)類(lèi)名都是以AutoConfiguration結(jié)尾的,這就基本可以確定上面那個(gè)configurations里面對(duì)應(yīng)的就是這些內(nèi)容,然后繼續(xù)在里面找我們認(rèn)識(shí)且熟悉的:

前面提到的內(nèi)置Tomcat就是在這個(gè)里面進(jìn)行配置的,我們通過(guò)這個(gè)全限定類(lèi)名繼續(xù)找到這個(gè)類(lèi):

我們通過(guò)關(guān)鍵注解@EnableConfigurationProperties(ServerProperties.class)繼續(xù)往下挖,找到ServerProperties這個(gè)類(lèi):

可以看到這個(gè)類(lèi)中定義了很多跟tomcat服務(wù)器有關(guān)的屬性,如port端口、address地址等,上面有一個(gè)@ConfigurationProperties注解的屬性中有一個(gè)prefix = “server”,這個(gè)其實(shí)就是對(duì)應(yīng)配置文件中的前綴,那么配置文件在哪呢,我們繼續(xù)回到spring.factories同級(jí)的目錄下,會(huì)發(fā)現(xiàn)如下的一個(gè)json文件:


在這個(gè).json文件中,可以找到跟剛才相關(guān)的配置,也就是說(shuō),這個(gè)json文件里面的值,就是SpringBoot自動(dòng)配置時(shí)幫我們配置的值,如果我們需要更改這些配置,只需要在我們的配置文件中配置一下就行了,就會(huì)覆蓋這里的默認(rèn)配置,而使用我們的自定義配置。
SpringBoot自動(dòng)配置原理的分析,到這里就基本結(jié)束了,雖然分析得比較淺薄,但是對(duì)于初學(xué)者想初步了解SpringBoot自動(dòng)配置過(guò)程來(lái)說(shuō),這種深度恰到好處。等進(jìn)一步熟練它的使用后,可以再進(jìn)一步往底層挖掘,雖然有些太細(xì)節(jié)的東西,在項(xiàng)目開(kāi)發(fā)中基本用不到,但是自己有一定了解的話,在使用過(guò)程中碰到問(wèn)題可以有更清晰的思路去定位并解決。
到此這篇關(guān)于SpringBoot起步依賴(lài)和自動(dòng)配置的文章就介紹到這了,更多相關(guān)SpringBoot起步依賴(lài)和自動(dòng)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行
這篇文章主要介紹了Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行,在本節(jié)示例中,我們將創(chuàng)建兩個(gè)線程,一個(gè)是普通線程,向隊(duì)列中寫(xiě)入事件,另外一個(gè)是守護(hù)線程,清除隊(duì)列中的事件,需要的朋友可以參考下2014-12-12
簡(jiǎn)單了解Java多線程實(shí)現(xiàn)的四種方式
這篇文章主要介紹了簡(jiǎn)單了解Java多線程實(shí)現(xiàn)的四種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
詳解如何在Spring?Security中自定義權(quán)限表達(dá)式
這篇文章主要和大家詳細(xì)介紹一下如何在Spring?Security中自定義權(quán)限表達(dá)式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-07-07
NameNode?重啟恢復(fù)數(shù)據(jù)的流程詳解
這篇文章主要為大家介紹了NameNode?重啟恢復(fù)數(shù)據(jù)的流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
深入理解Java8新特性之接口中的默認(rèn)方法和靜態(tài)方法
從Java8開(kāi)始,程序允許在接口中包含帶有具體實(shí)現(xiàn)的方法,使用default修飾,這類(lèi)方法就是默認(rèn)方法。默認(rèn)方法在接口中可以添加多個(gè),并且Java8提供了很多對(duì)應(yīng)的接口默認(rèn)方法,接下來(lái)讓我們一起來(lái)看看吧2021-11-11
Java 獲取當(dāng)前類(lèi)名和方法名的實(shí)現(xiàn)方法
這篇文章主要介紹了 Java 獲取當(dāng)前類(lèi)名和方法名的實(shí)現(xiàn)方法的相關(guān)資料,這里不僅提供了實(shí)現(xiàn)方法并比較幾種方法的效率,需要的朋友可以參考下2017-07-07
ConcurrentHashMap線程安全及實(shí)現(xiàn)原理實(shí)例解析
這篇文章主要介紹了ConcurrentHashMap線程安全及實(shí)現(xiàn)原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

