目錄
按需求定制制作可以根據(jù)自己的需求進(jìn)行定制,做網(wǎng)站、網(wǎng)站建設(shè)構(gòu)思過(guò)程中功能建設(shè)理應(yīng)排到主要部位公司做網(wǎng)站、網(wǎng)站建設(shè)的運(yùn)用實(shí)際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實(shí)際意義1、產(chǎn)生疑惑?
2、源碼分析
2.1、pom.xml文件分析
2.2、啟動(dòng)類分析
3、總結(jié)
當(dāng)我們第一次使用Spring Boot練習(xí)的時(shí)候會(huì)覺(jué)得Spring Boot這么厲害,不管是依賴還是配置,它都為我們準(zhǔn)備好了,我們只需要去編寫(xiě)業(yè)務(wù)代碼就可以了,省去了配置的繁瑣。那么Spring Boot之所以能夠?yàn)槲覀兲峁┻@些操作,它是如何實(shí)現(xiàn)的呢?
2、源碼分析 2.1、pom.xml文件分析我們打開(kāi)創(chuàng)建Spring Boot項(xiàng)目后的pom.xml文件
可以看到這里有一個(gè)parent標(biāo)簽,這就父級(jí)工程spring-boot-starter-parent,這叫做Spring Boot的起步依賴,那么這個(gè)起步依賴有什么東西呢,我們使用ctrl+左鍵打開(kāi)看看
可以看到這里面又繼承于一個(gè)spring-boot-dependencies的依賴,這就是Spring Boot的核心依賴,我們繼續(xù)打開(kāi)
可以看到,這里面整合了大量的依賴和插件,以及各個(gè)依賴的版本,非常大的文件,整整3200多行,這就是Spring Boot的核心依賴庫(kù),之所以我們不用再去手動(dòng)導(dǎo)依賴的原因,就是Spring Boot已經(jīng)把大量我們能用到的整合到了這個(gè)庫(kù)中,之所以我們不用再聲明依賴的版本是因?yàn)椋琒pring Boot做了統(tǒng)一的版本控制,不同版本的Spring Boot,里面會(huì)有不同版本的依賴。這也是Spring Boot特點(diǎn)之一約定大于配置。
Spring Boot還有很多啟動(dòng)依賴,spring-boot-starter只是其中一個(gè)
org.springframework.boot spring-boot-starterorg.springframework.boot spring-boot-starter-web
2.2、啟動(dòng)類分析有了依賴的支持,那么Spring Boot是如何實(shí)現(xiàn)自動(dòng)配置的呢?
這就需要我們?nèi)パ芯恳幌聠?dòng)類中@SpringBootAppliation注解
我們ctrl+鼠標(biāo)左鍵打開(kāi)注解的源碼
可以看到里面是一個(gè)自定義注解的形式
@Target(ElementType.Type)? ?返回可以應(yīng)用于注釋類型的元素類型的數(shù)組
@Retention(RetentionPolicy.RUNTIME)? ? 指示被它注解的注解保留多久
注解 | 說(shuō)明 |
---|---|
SOURCE | 注解只保留在源文件,當(dāng)Java文件編譯成class文件的時(shí)候,注解被遺棄;被編譯器忽略 |
CLASS | 注解被保留到class文件,但jvm加載class文件時(shí)候被遺棄,這是默認(rèn)的生命周期 |
RUNTIME | 注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在 |
@Documented? ?
指示帶有類型的注釋在默認(rèn)情況下由javadoc和類似工具記錄。該類型應(yīng)用于注釋類型的聲明,這些類型的注釋影響其客戶端對(duì)注釋元素的使用。
@Inherited?
指示自動(dòng)繼承注釋類型。
@SpringBootConfiguration (核心注解)
該注解作用:?
1.標(biāo)明本類是個(gè)配置類
2.掃描添加了@Configuration的配置類。
@EnableAutoConfiguration (最核心的注解)?開(kāi)啟自動(dòng)配置
我們打開(kāi)@Import注解里的AutoConfigurationImportSelector類
找到selectImports方法,里面調(diào)用了一個(gè)getAutoConfigurationEntry方法
我們ctrl+左鍵找到此方法,找到getCandidateConfigurations方法
在方法中找到loadFactoryNames方法?
經(jīng)過(guò)層層的尋找,終于在最后找到了獲取資源的路徑,是在META-INF/spring.factories文件中
Spring Boot自動(dòng)裝配的本質(zhì)就是通過(guò)Spring去讀取META-INF/spring.factories中保存的配置類文件然后加載bean定義的過(guò)程。
在jar包中,我們?nèi)ふ乙幌逻@個(gè)文件
可以看到,里面有非常多的配置,其中紅框中的就是常見(jiàn)的ElasticSearch、MongoData、Redis、SpringData。。。
這就是為什么Spring Boot不用再去讓我們?cè)偃リP(guān)注配置的原因
那么這么多配置信息,在Spring Boot啟動(dòng)的時(shí)候都會(huì)為我們配置上嗎?那不用的配置也要配置嗎?其實(shí)這點(diǎn)Sring Boot早就考慮到了,這些配置信息,只有我們添加了相關(guān)依賴才會(huì)為我們進(jìn)行配置。
那么Spring Boot是通過(guò)什么來(lái)實(shí)現(xiàn)根據(jù)添加的依賴進(jìn)行加載對(duì)應(yīng)配置信息呢?
我們可以隨便找一個(gè)第三方配置類進(jìn)去看一下,這里我選擇redis
可以看到,這里有一個(gè)注解沒(méi)有見(jiàn)過(guò),@ConditionalOnClass注解,這個(gè)注解的作用就是檢查是否導(dǎo)入相關(guān)依賴,如果沒(méi)有導(dǎo)入,則該類各個(gè)方法就會(huì)報(bào)錯(cuò)
3、總結(jié)經(jīng)過(guò)上面的分析,Spring Boot的自動(dòng)裝配原理總結(jié)一句話為:
Spring Boot啟動(dòng)的時(shí)候加載主配置類,其中@EnableAutoConfiguration注解會(huì)通過(guò)@Import注解掃描所有jar包類路徑下的"META-INF/spring.factories",里面標(biāo)注了自動(dòng)配置類,自動(dòng)配置類會(huì)通過(guò)
@ConditionalOnClass注解檢測(cè)是否添加了相關(guān)依賴,如果添加了相關(guān)依賴會(huì)把自動(dòng)配置類中bean添加到容器中,完成自動(dòng)配置。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧