摘要:開(kāi)啟自動(dòng)配置功能后文詳解這個(gè)注解,學(xué)過(guò)的同學(xué)應(yīng)該對(duì)它不會(huì)陌生,就是掃描注解,默認(rèn)是掃描當(dāng)前類(lèi)下的。簡(jiǎn)單來(lái)說(shuō),這個(gè)注解可以幫助我們自動(dòng)載入應(yīng)用程序所需要的所有默認(rèn)配置。簡(jiǎn)單理解這二者掃描的對(duì)象是不一樣的。
前言
只有光頭才能變強(qiáng)。
文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y
回顧前面Spring的文章(以學(xué)習(xí)的順序排好):
Spring入門(mén)這一篇就夠了
Spring【依賴(lài)注入】就是這么簡(jiǎn)單
Spring【AOP模塊】就這么簡(jiǎn)單
Spring【DAO模塊】知識(shí)要點(diǎn)
SpringMVC入門(mén)就這么簡(jiǎn)單
SpringMVC【開(kāi)發(fā)Controller】詳解
SpringMVC【參數(shù)綁定、數(shù)據(jù)回顯、文件上傳】
SpringMVC【校驗(yàn)器、統(tǒng)一處理異常、RESTful、攔截器】
SpringBoot就是這么簡(jiǎn)單
SpringData JPA就是這么簡(jiǎn)單
Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!
Spring AOP就是這么簡(jiǎn)單啦
外行人都能看懂的SpringCloud,錯(cuò)過(guò)了血虧!
作為一名Java程序員,就不可能不了解SpringBoot,如果不了解(趕緊學(xué)!)
一、SpringBoot的自動(dòng)配置原理不知道大家第一次搭SpringBoot環(huán)境的時(shí)候,有沒(méi)有覺(jué)得非常簡(jiǎn)單。無(wú)須各種的配置文件,無(wú)須各種繁雜的pom坐標(biāo),一個(gè)main方法,就能run起來(lái)了。與其他框架整合也賊方便,使用EnableXXXXX注解就可以搞起來(lái)了!
所以今天來(lái)講講SpringBoot是如何實(shí)現(xiàn)自動(dòng)配置的~
1.1三個(gè)重要的注解我們可以發(fā)現(xiàn),在使用main()啟動(dòng)SpringBoot的時(shí)候,只有一個(gè)注解@SpringBootApplication
我們可以點(diǎn)擊進(jìn)去@SpringBootApplication注解中看看,可以發(fā)現(xiàn)有三個(gè)注解是比較重要的:
@SpringBootConfiguration:我們點(diǎn)進(jìn)去以后可以發(fā)現(xiàn)底層是Configuration注解,說(shuō)白了就是支持JavaConfig的方式來(lái)進(jìn)行配置(使用Configuration配置類(lèi)等同于XML文件)。
@EnableAutoConfiguration:開(kāi)啟自動(dòng)配置功能(后文詳解)
@ComponentScan:這個(gè)注解,學(xué)過(guò)Spring的同學(xué)應(yīng)該對(duì)它不會(huì)陌生,就是掃描注解,默認(rèn)是掃描當(dāng)前類(lèi)下的package。將@Controller/@Service/@Component/@Repository等注解加載到IOC容器中。
所以,Java3yApplication類(lèi)可以被我們當(dāng)做是這樣的:
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan public class Java3yApplication { public static void main(String[] args) { SpringApplication.run(Java3yApplication.class, args); } }1.2重點(diǎn)EnableAutoConfiguration
我們知道SpringBoot可以幫我們減少很多的配置,也肯定聽(tīng)過(guò)“約定大于配置”這么一句話,那SpringBoot是怎么做的呢?其實(shí)靠的就是@EnableAutoConfiguration注解。
簡(jiǎn)單來(lái)說(shuō),這個(gè)注解可以幫助我們自動(dòng)載入應(yīng)用程序所需要的所有默認(rèn)配置。
介紹有一句說(shuō):
if you have tomcat-embedded.jar on your classpath you are likely to want a TomcatServletWebServerFactory
如果你的類(lèi)路徑下有tomcat-embedded.jar包,那么你很可能就需要TomcatServletWebServerFactory
我們點(diǎn)進(jìn)去看一下,發(fā)現(xiàn)有兩個(gè)比較重要的注解:
@AutoConfigurationPackage:自動(dòng)配置包
@Import:給IOC容器導(dǎo)入組件
1.2.1AutoConfigurationPackage網(wǎng)上將這個(gè)@AutoConfigurationPackage注解解釋成自動(dòng)配置包,我們也看看@AutoConfigurationPackage里邊有什么:
我們可以發(fā)現(xiàn),依靠的還是@Import注解,再點(diǎn)進(jìn)去查看,我們發(fā)現(xiàn)重要的就是以下的代碼:
@Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { register(registry, new PackageImport(metadata).getPackageName()); }
在默認(rèn)的情況下就是將:主配置類(lèi)(@SpringBootApplication)的所在包及其子包里邊的組件掃描到Spring容器中。
看完這句話,會(huì)不會(huì)覺(jué)得,這不就是ComponentScan的功能嗎?這倆不就重復(fù)了嗎?
我開(kāi)始也有這個(gè)疑問(wèn),直到我看到文檔的這句話:
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.
比如說(shuō),你用了Spring Data JPA,可能會(huì)在實(shí)體類(lèi)上寫(xiě)@Entity注解。這個(gè)@Entity注解由@AutoConfigurationPackage掃描并加載,而我們平時(shí)開(kāi)發(fā)用的@Controller/@Service/@Component/@Repository這些注解是由ComponentScan來(lái)掃描并加載的。
簡(jiǎn)單理解:這二者掃描的對(duì)象是不一樣的。
1.2.2回到Import我們回到@Import(AutoConfigurationImportSelector.class)這句代碼上,再點(diǎn)進(jìn)去AutoConfigurationImportSelector.class看看具體的實(shí)現(xiàn)是什么:
我們?cè)龠M(jìn)去看一下這些配置信息是從哪里來(lái)的(進(jìn)去getCandidateConfigurations方法):
這里包裝了一層,我們看到的只是通過(guò)SpringFactoriesLoader來(lái)加載,還沒(méi)看到關(guān)鍵信息,繼續(xù)進(jìn)去:
簡(jiǎn)單梳理:
FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories
Spring啟動(dòng)的時(shí)候會(huì)掃描所有jar路徑下的META-INF/spring.factories,將其文件包裝成Properties對(duì)象
從Properties對(duì)象獲取到key值為EnableAutoConfiguration的數(shù)據(jù),然后添加到容器里邊。
最后我們會(huì)默認(rèn)加載113個(gè)默認(rèn)的配置類(lèi):
有興趣的同學(xué)可以去翻一下這些文件以及配置類(lèi)哦:
1.3總結(jié)@SpringBootApplication等同于下面三個(gè)注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration是關(guān)鍵(啟用自動(dòng)配置),內(nèi)部實(shí)際上就去加載META-INF/spring.factories文件的信息,然后篩選出以EnableAutoConfiguration為key的數(shù)據(jù),加載到IOC容器中,實(shí)現(xiàn)自動(dòng)配置功能!
官網(wǎng)文檔參考:
https://docs.spring.io/spring-boot/docs/2.2.0.BUILD-SNAPSHOT/reference/html/using-spring-boot.html#using-boot-structuring-your-code
英語(yǔ)不好的同學(xué)可以像我一樣,對(duì)照著來(lái)看:
最后樂(lè)于輸出干貨的Java技術(shù)公眾號(hào):Java3y。公眾號(hào)內(nèi)有200多篇原創(chuàng)技術(shù)文章、海量視頻資源、精美腦圖,不妨來(lái)關(guān)注一下!
覺(jué)得我的文章寫(xiě)得不錯(cuò),不妨點(diǎn)一下贊!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73205.html
摘要:?jiǎn)?dòng)原理和執(zhí)行原理分析一的啟動(dòng)原理我們打開(kāi),注意看下面兩個(gè)依賴(lài)我們第一步是繼承了父項(xiàng)目,然后在添加啟動(dòng)器的依賴(lài),項(xiàng)目就會(huì)自動(dòng)給我們導(dǎo)入關(guān)于項(xiàng)目所需要的配置和。 上一篇我們看到,我們很輕松的完成了項(xiàng)目的構(gòu)建,那么SpringBoot是如何做到的呢,在使用的使用又有哪些通用配置和注意事項(xiàng)呢? 其實(shí)SpringBoot給我們做了大量的自動(dòng)配置功能,我們只需要引入對(duì)應(yīng)的啟動(dòng)器就可以直接使用,作...
摘要:作者譚淼一運(yùn)行原理的運(yùn)行是由注解提供的。完成自動(dòng)配置類(lèi)。自動(dòng)配置類(lèi)主要作用是的配置核心,它會(huì)寫(xiě)在中,告知在啟動(dòng)時(shí)去讀取該類(lèi)并根據(jù)該類(lèi)的規(guī)則進(jìn)行配置。會(huì)檢測(cè)是否存在類(lèi)類(lèi)會(huì)查看是否開(kāi)啟該自動(dòng)配置。 作者:譚淼 一、運(yùn)行原理 Spring Boot的運(yùn)行是由注解@EnableAutoConfiguration提供的。 @Target({ElementType.TYPE}) @Retentio...
摘要:即,根據(jù)包依賴(lài),添加自動(dòng)配置。會(huì)讀取的核心配置文件中的配置備注的條件注解 SpringBoot自動(dòng)配置 1、自動(dòng)配置之spring.factories showImg(https://segmentfault.com/img/bVbjyDr?w=693&h=130); showImg(https://segmentfault.com/img/bVbjyDs?w=409&h=184); ...
摘要:這里有一個(gè)參數(shù),主要是用來(lái)指定該配置項(xiàng)在配置文件中的前綴。創(chuàng)建一個(gè)配置類(lèi),里面沒(méi)有顯式聲明任何的,然后將剛才創(chuàng)建的導(dǎo)入。創(chuàng)建實(shí)現(xiàn)類(lèi),返回的全類(lèi)名。創(chuàng)建實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)方法直接手動(dòng)注冊(cè)一個(gè)名叫的到容器中。前言 小伙伴們是否想起曾經(jīng)被 SSM 整合支配的恐懼?相信很多小伙伴都是有過(guò)這樣的經(jīng)歷的,一大堆配置問(wèn)題,各種排除掃描,導(dǎo)入一個(gè)新的依賴(lài)又得添加新的配置。自從有了 SpringBoot 之后,咋...
摘要:下班后閑著無(wú)聊看了下中的自動(dòng)配置,把我的理解跟大家說(shuō)下。上述的每一個(gè)自動(dòng)配置類(lèi)都有自動(dòng)配置功能,也可在配置文件中自定義配置。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人。如有問(wèn)題,請(qǐng)后臺(tái)留言,反正我也不會(huì)聽(tīng)。 前言 這個(gè)月過(guò)去兩天了,這篇文章才跟大家見(jiàn)面,最近比較累,大家見(jiàn)諒下。下班后閑著無(wú)聊看了下 SpringBoot 中的自動(dòng)配置,把我的理解跟大家說(shuō)下。 配置文件能寫(xiě)什么? 相信接觸過(guò) Sprin...
閱讀 3528·2021-11-18 10:02
閱讀 3103·2019-08-29 18:34
閱讀 3389·2019-08-29 17:00
閱讀 420·2019-08-29 12:35
閱讀 747·2019-08-28 18:22
閱讀 1910·2019-08-26 13:58
閱讀 1659·2019-08-26 10:39
閱讀 2668·2019-08-26 10:11