一、自動(dòng)配置及原理
1、springboot自動(dòng)配置了哪些功能
1)tomcat的自動(dòng)配置
引入了tomcat的相關(guān)依賴
2)自動(dòng)配置springmvc及常用功能
我們?cè)谥鲉?dòng)類中加兩行代碼,查看一下spring boot加載了哪些組件
通過在控制臺(tái)輸出中搜索,我們可以發(fā)現(xiàn)轉(zhuǎn)發(fā)請(qǐng)求的dispatcherServlet、解決亂碼的characterEncodingFilter還有視圖解析器ViewResolver都已經(jīng)被自動(dòng)加載
3)默認(rèn)的包結(jié)構(gòu)
主程序所在包及其下面的所有子包里面的組件都會(huì)被默認(rèn)掃描進(jìn)來,無需向之前那樣專門去配置
如果想調(diào)整包掃描路徑,可以將主啟動(dòng)類中的@SpringBootApplication注解替換成
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
然后再@ComponentScan后面指定自己想要的包掃描路徑
4)各種配置都具有默認(rèn)值
我們可以簡單看下各個(gè)配置的默認(rèn)值
默認(rèn)配置最終都是映射到某個(gè)類上,這個(gè)類會(huì)在容器中創(chuàng)建對(duì)象
5)按需加載所有的自動(dòng)配置項(xiàng)
并非所有的自動(dòng)配置項(xiàng)都會(huì)加載,只有我們引入了對(duì)應(yīng)的啟動(dòng)器,才會(huì)自動(dòng)加載相應(yīng)的自動(dòng)配置項(xiàng)
SpringBoot所有的自動(dòng)配置功能都在spring-boot-autoconfigure這個(gè)jar包里面
2、注解分析
1)底層注解分析
- @Configuration:標(biāo)注當(dāng)前類是一個(gè)配置類,可以使用@Configuration+@Bean的方式注冊(cè)bean到spring boot的IOC容器中,默認(rèn)是單實(shí)例的,可參考我之前的博客 【Spring】使用JavaConfig實(shí)現(xiàn)配置
- 此注解新加了一個(gè)屬性proxyBeanMethods,默認(rèn)開啟
- 如果此屬性為true,那么每次@Bean方法被調(diào)用多少次返回的組件都是單實(shí)例的,如果是false,那么保證每個(gè)@Bean方法被調(diào)用多少次返回的組件都是新創(chuàng)建的
- 如果bean之間存在組件依賴必須使用Full模式(proxyBeanMethods=true),其他默認(rèn)使用Lite模式(proxyBeanMethods=false)
- @Import:在IOC容器中自動(dòng)創(chuàng)建出引入類型的bean,默認(rèn)bean的名字就是全類名
- @ConditionalOnProperty(xxx):判斷括號(hào)內(nèi)的配置是否存在且配在auto配置且值為true就生效,你沒配我也認(rèn)為配了
- @Conditional:條件裝配,滿足Conditional指定的條件,則進(jìn)行bean注入,它有很多子類
- @ImportResource:用于導(dǎo)入 Spring 的 xml 配置文件,將該配置文件中定義的 bean 對(duì)象加載到Spring容器中,在配置類上使用
- 想要將配置文件中的配置與類進(jìn)行綁定,可以使用下面兩種組合的注解
- @ConfigurationProperties(prefix=“xxx”)+@Component:配置綁定,使用在實(shí)體類上,prefix前綴的值為配置文件中配置項(xiàng)的前綴
- @EnableConfigurationProperties(xxx.class)+@ConfigurationProperties
@EnableConfigurationProperties使用在配置類上,括號(hào)內(nèi)填需要綁定配置的實(shí)體類,它的作用是使得@ConfigurationProperties注解生效,將括號(hào)內(nèi)的bean注冊(cè)到容器中
@ConfigurationProperties使用在實(shí)體類上,這個(gè)注解通常是用來將properties和yml配置文件屬性轉(zhuǎn)化為bean對(duì)象使用
2)主啟動(dòng)類核心注解
主啟動(dòng)類中的@SpringBootApplication就等于@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan
-
@SpringBootConfiguration,繼續(xù)深入可以發(fā)現(xiàn)它就是@Configuration注解修飾的,表示這個(gè)類就是一個(gè)配置類
-
@EnableAutoConfiguration
-
@AutoConfigurationPackage
繼續(xù)深入可以發(fā)現(xiàn),這個(gè)注解上面有一個(gè)@Import({Registrar.class})注解,作用就是將Register注冊(cè)到組件中
Register類里有一個(gè)方法可以批量注冊(cè)bean,我們使用debug模式看一下傳進(jìn)來的元數(shù)據(jù),這樣就可以理解為什么Spring boot可以不用配置自動(dòng)掃描了,因?yàn)樗鼘?dòng)類所在包下的類都注冊(cè)到容器中了 -
@Import({AutoConfigurationImportSelector.class})
這個(gè)類和spring boot導(dǎo)入自動(dòng)配置類有關(guān),框架啟動(dòng)時(shí)會(huì)加載所有的配置類(關(guān)鍵文件META-INF下的spring.factories),但是因?yàn)闂l件裝配規(guī)則(即@Conditional相關(guān)注解)的存在,這些自動(dòng)配置會(huì)按需生效
上面這個(gè)方法會(huì)去我們引入的jar包下找META-INF/spring.factories文件,如果有
org.springframework.boot.autoconfigure.EnableAutoConfiguration修飾的類,就會(huì)加載進(jìn)來
注意,從spring boot2.7開始,慢慢不支持META-INF/spring.factories文件了
需要導(dǎo)入的自動(dòng)配置類可以放在/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中,可以看下spring-boot-autoconfigure-2.7.0.jar下的這個(gè)文件
-
-
@ComponentScan:指定掃描哪些類,將其注冊(cè)到容器中
3、自動(dòng)配置實(shí)現(xiàn)原理
那么問題來了,spring boot是如何做到讓我們免去那么多麻煩的配置的呢?
我們可以看一下DispatcherServletAutoConfiguration和HttpEncodingAutoConfiguration的源碼
我們可以發(fā)現(xiàn),spring boot在底層都幫我們預(yù)先配置了所有的組件,但是會(huì)以用戶自己配置的優(yōu)先
如果用戶沒有配,那么就默認(rèn)把框架默認(rèn)配置好的bean注冊(cè)到容器中
4、SpringBootApplication類
首先我們先跟進(jìn)run方法看下,發(fā)現(xiàn)在調(diào)用run之前,程序調(diào)用了SpringApplication類的構(gòu)造方法
然后我們看下構(gòu)造器里面做了什么
首先他判斷當(dāng)前項(xiàng)目是否為web項(xiàng)目(是否包含SpringBootWeb的相關(guān)依賴)
然后就是看一下接下來的getSpringFactoriesInstances()方法
這里面有一個(gè)SpringFactoriesLoader.loadFactoryNames(type, classLoader)方法
跟進(jìn)去看一下,發(fā)現(xiàn)他會(huì)去每個(gè)依賴下讀META-INF/spring.factories文件(自動(dòng)裝配的核心文件)
如果發(fā)現(xiàn)有當(dāng)前接口類的實(shí)現(xiàn)類,就會(huì)統(tǒng)一放在list集合中返回
接著就根據(jù)上一步的返回結(jié)果,調(diào)用相關(guān)方法初始化相關(guān)bean的實(shí)例,進(jìn)行排序后返回實(shí)例
總結(jié):文章來源:http://www.zghlxwxcb.cn/news/detail-405552.html
- SpringBoot先加載所有的自動(dòng)配置類 xxxxxAutoConfiguration
- 每個(gè)自動(dòng)配置類按照條件進(jìn)行生效,默認(rèn)都會(huì)綁定配置文件指定的值。它會(huì)去xxxxProperties里面拿,而xxxProperties和配置文件進(jìn)行了綁定
- 生效的配置類就會(huì)給容器中裝配很多組件
- 只要容器中有這些組件,相當(dāng)于這些功能就有了
- 定制化配置
- 直接自己@Bean替換底層的組件
- 查看這個(gè)組件獲取配置文件是哪個(gè),就去application.properties或者yaml文件中修改對(duì)應(yīng)的配置項(xiàng)
如有錯(cuò)誤,歡迎指正??!文章來源地址http://www.zghlxwxcb.cn/news/detail-405552.html
到了這里,關(guān)于【Spring Boot】自動(dòng)配置及重要注解解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!