小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SpringBoot自動配置原理

 甘甘灰 2019-01-30

前言

只有光頭才能變強(qiáng)。

文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y

回顧前面Spring的文章(以學(xué)習(xí)的順序排好):

作為一名Java程序員,就不可能不了解SpringBoot,如果不了解(趕緊學(xué)!)

一、SpringBoot的自動配置原理

不知道大家第一次搭SpringBoot環(huán)境的時候,有沒有覺得非常簡單。無須各種的配置文件,無須各種繁雜的pom坐標(biāo),一個main方法,就能run起來了。與其他框架整合也賊方便,使用EnableXXXXX注解就可以搞起來了!

所以今天來講講SpringBoot是如何實(shí)現(xiàn)自動配置的~

1.1三個重要的注解

我們可以發(fā)現(xiàn),在使用main()啟動SpringBoot的時候,只有一個注解@SpringBootApplication

只有一個@SpringBootApplication注解

我們可以點(diǎn)擊進(jìn)去@SpringBootApplication注解中看看,可以發(fā)現(xiàn)有三個注解是比較重要的:

SpringBootApplication注解詳情
  • @SpringBootConfiguration:我們點(diǎn)進(jìn)去以后可以發(fā)現(xiàn)底層是Configuration注解,說白了就是支持JavaConfig的方式來進(jìn)行配置(使用Configuration配置類等同于XML文件)。
  • @EnableAutoConfiguration:開啟自動配置功能(后文詳解)
  • @ComponentScan:這個注解,學(xué)過Spring的同學(xué)應(yīng)該對它不會陌生,就是掃描注解,默認(rèn)是掃描當(dāng)前類下的package。將@Controller/@Service/@Component/@Repository等注解加載到IOC容器中。

所以,Java3yApplication類可以被我們當(dāng)做是這樣的:

1.2重點(diǎn)EnableAutoConfiguration

我們知道SpringBoot可以幫我們減少很多的配置,也肯定聽過“約定大于配置”這么一句話,那SpringBoot是怎么做的呢?其實(shí)靠的就是@EnableAutoConfiguration注解。

簡單來說,這個注解可以幫助我們自動載入應(yīng)用程序所需要的所有默認(rèn)配置。

介紹有一句說:

if you have tomcat-embedded.jar on your classpath you are likely to want a TomcatServletWebServerFactory

如果你的類路徑下有tomcat-embedded.jar包,那么你很可能就需要TomcatServletWebServerFactory

我們點(diǎn)進(jìn)去看一下,發(fā)現(xiàn)有兩個比較重要的注解:

EnableAutoConfiguration注解詳情
  • @AutoConfigurationPackage:自動配置包
  • @Import:給IOC容器導(dǎo)入組件

1.2.1AutoConfigurationPackage

網(wǎng)上將這個@AutoConfigurationPackage注解解釋成自動配置包,我們也看看@AutoConfigurationPackage里邊有什么:

AutoConfigurationPackage注解實(shí)現(xiàn)

我們可以發(fā)現(xiàn),依靠的還是@Import注解,再點(diǎn)進(jìn)去查看,我們發(fā)現(xiàn)重要的就是以下的代碼:

默認(rèn)的情況下就是將:主配置類(@SpringBootApplication)的所在包及其子包里邊的組件掃描到Spring容器中。

  • 看完這句話,會不會覺得,這不就是ComponentScan的功能嗎?這倆不就重復(fù)了嗎?

我開始也有這個疑問,直到我看到文檔的這句話:

it will be used when scanning for code @Entity classes.
It is generally recommended that you place EnableAutoConfiguration (if you're
not using @SpringBootApplication) in a root package so that all sub-packages
and classes can be searched.

比如說,你用了Spring Data JPA,可能會在實(shí)體類上寫@Entity注解。這個@Entity注解由@AutoConfigurationPackage掃描并加載,而我們平時開發(fā)用的@Controller/@Service/@Component/@Repository這些注解是由ComponentScan來掃描并加載的。

  • 簡單理解:這二者掃描的對象是不一樣的。

1.2.2回到Import

我們回到@Import(AutoConfigurationImportSelector.class)這句代碼上,再點(diǎn)進(jìn)去AutoConfigurationImportSelector.class看看具體的實(shí)現(xiàn)是什么:

得到很多配置信息

我們再進(jìn)去看一下這些配置信息是從哪里來的(進(jìn)去getCandidateConfigurations方法):

通過SpringFactoriesLoader來加載

這里包裝了一層,我們看到的只是通過SpringFactoriesLoader來加載,還沒看到關(guān)鍵信息,繼續(xù)進(jìn)去:

跟蹤實(shí)現(xiàn)

簡單梳理:

  • FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories
  • Spring啟動的時候會掃描所有jar路徑下的META-INF/spring.factories,將其文件包裝成Properties對象
  • 從Properties對象獲取到key值為EnableAutoConfiguration的數(shù)據(jù),然后添加到容器里邊。
從Properties對象獲取到EnableAutoConfiguration.class對應(yīng)的值,然后添加到容器里邊

最后我們會默認(rèn)加載113個默認(rèn)的配置類:

image

有興趣的同學(xué)可以去翻一下這些文件以及配置類哦:

加載的配置類和文件的信息

1.3總結(jié)

@SpringBootApplication等同于下面三個注解:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

其中@EnableAutoConfiguration是關(guān)鍵(啟用自動配置),內(nèi)部實(shí)際上就去加載META-INF/spring.factories文件的信息,然后篩選出以EnableAutoConfiguration為key的數(shù)據(jù),加載到IOC容器中,實(shí)現(xiàn)自動配置功能!

自動配置功能

官網(wǎng)文檔參考:

英語不好的同學(xué)可以像我一樣,對照著來看:

一邊插件,一邊原文

最后

樂于輸出干貨的Java技術(shù)公眾號:Java3y。公眾號內(nèi)有200多篇原創(chuàng)技術(shù)文章、海量視頻資源、精美腦圖,不妨來關(guān)注一下!

帥的人都關(guān)注了

覺得我的文章寫得不錯,不妨點(diǎn)一下

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多