javascript
springboot 获取配置文件中的值_Spring Boot面试必问(亲测)
springboot面試大概率會(huì)問(wèn)到的問(wèn)題:什么是Spring Boot?Spring Boot與Spring cloud的區(qū)別Spring Boot有哪些特性Spring Boot配置文件的優(yōu)先級(jí)
1、什么是Spring Boot?
Spring Boot是spring的腳手架,使用Spring Boot可以做到專注于Spring應(yīng)用的開(kāi)發(fā),而無(wú)需過(guò)多關(guān)注XML的配置。能夠使開(kāi)發(fā)者在極短的時(shí)間內(nèi)開(kāi)發(fā)出單個(gè)微服務(wù)。Spring Boot使用“習(xí)慣優(yōu)于配置”的理念,簡(jiǎn)單來(lái)說(shuō),它提供了一堆依賴打包,并已經(jīng)按照使用習(xí)慣解決了依賴問(wèn)題。使用Spring Boot可以不用或者只需要很少的Spring配置就可以讓企業(yè)項(xiàng)目快速運(yùn)行起來(lái)。
Spring Boot的核心功能:
- 可獨(dú)立運(yùn)行的Spring項(xiàng)目:Spring Boot可以以jar包的形式獨(dú)立運(yùn)行。
- 內(nèi)嵌的Servlet容器:Spring Boot可以選擇內(nèi)嵌Tomcat、Jetty或者Undertow,無(wú)須以war包形式部署項(xiàng)目。
- 簡(jiǎn)化的Maven配置:Spring提供推薦的基礎(chǔ) POM 文件來(lái)簡(jiǎn)化Maven 配置。
- 自動(dòng)配置Spring:Spring Boot會(huì)根據(jù)項(xiàng)目依賴來(lái)自動(dòng)配置Spring 框架,極大地減少項(xiàng)目要使用的配置。
- 提供生產(chǎn)就緒型功能:提供可以直接在生產(chǎn)環(huán)境中使用的功能,如性能指標(biāo)、應(yīng)用信息和應(yīng)用健康檢查。
- 無(wú)代碼生成和xml配置:Spring Boot不生成代碼。完全不需要任何xml配置即可實(shí)現(xiàn)Spring的所有配置。
2、Spring Boot與Spring cloud的區(qū)別
- Spring boot是Spring的一套快速配置腳手架,可以基于Spring Boot快速開(kāi)發(fā)單個(gè)微服務(wù);Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開(kāi)發(fā)工具
- Spring Boot專注于快速、方便集成的單個(gè)個(gè)體,Spring Cloud是關(guān)注全局的服務(wù)治理框架;
- Spring boot使用了默認(rèn)大于配置的理念,很多集成方案已經(jīng)幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot來(lái)實(shí)現(xiàn)。
- Spring Boot可以離開(kāi)Spring Cloud獨(dú)立使用開(kāi)發(fā)項(xiàng)目,但是Spring Cloud離不開(kāi)Spring Boot,屬于依賴的關(guān)系。
3、Spring Boot有哪些特性
這個(gè)問(wèn)題就很容易被問(wèn)到了,Spring Boot主要有兩大特性,分別是:起步依賴和自動(dòng)裝配,接下來(lái)就仔細(xì)說(shuō)一下:
起步依賴:
每一個(gè)Spring Boot項(xiàng)目都必須繼承依賴:spring-boot-starter-parent,而點(diǎn)進(jìn)這個(gè)依賴能看到,它又繼承了spring-boot-dependencies依賴,如下圖:
而在spring-boot-dependencies的pom文件中,有大量的依賴,以及定義好的每個(gè)依賴的版本號(hào),這里的版本號(hào),是根據(jù)springboot的版本號(hào)而定義的,不同版本的springboot版本,各個(gè)依賴的版本號(hào)也不一致的:
這里即解決了我們?cè)许?xiàng)目中可能存在依賴版本沖突的問(wèn)題,它來(lái)真正管理spring boot應(yīng)用里面的所有依賴版本。
除了繼承父依賴之外,我們的項(xiàng)目還需要引入spring-boot-starter-web依賴,它幫我們導(dǎo)入了web模塊正常運(yùn)行所依賴的組件,這些依賴的版本則由父項(xiàng)目進(jìn)行管理。而這個(gè)里面也引用了tomcat的依賴,我們可以通過(guò)自動(dòng)裝配的tomcat端口啟動(dòng)項(xiàng)目。
總結(jié):
在起步依賴上,spring boot幫我們管理了各個(gè)依賴的版本,使各個(gè)依賴不會(huì)出現(xiàn)版本沖突;另外,幫我們打包了各個(gè)依賴讓我們不用再像之前那樣自己導(dǎo)入一大堆的依賴,只要引入起步依賴的坐標(biāo)就可以進(jìn)行web開(kāi)發(fā)了,同樣體現(xiàn)了依賴傳遞的用。
自動(dòng)裝配:
自動(dòng)裝配也是spring boot的一大特性,新建spring boot項(xiàng)目之后,會(huì)發(fā)現(xiàn)在啟動(dòng)類上有個(gè)@SpringBootApplication注解,而springboot也是通過(guò)該注解去自動(dòng)裝配的,點(diǎn)進(jìn)去@SpringBootApplication注解可看到如下內(nèi)容:
可以看到,@SpringBootApplication注解可以算是由三個(gè)注解組成的,@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。由這三個(gè)注解組成,@ComponentScan就很熟悉啦,就是用來(lái)配置spring容器掃描路徑的,默認(rèn)指掃描當(dāng)前啟動(dòng)類所在的包里的對(duì)象,如果你想在本服務(wù)使用其他服務(wù)的類,可以在@SpringBootApplication注解后面添加(scanBasePackages = {"其他服務(wù)包路徑:如com.aaa.bbb", "本服務(wù)包路徑"}),接下來(lái)看下@SpringBootConfiguration注解:
這里面啥都沒(méi)有,其實(shí)@SpringBootConfiguration注解就等同于@Configuration注解,而@Configuration注解也很熟悉啦,使用注解@Configuration的類,就表示這個(gè)類是SpringBoot bean的創(chuàng)建的配置文件類。啟動(dòng)類標(biāo)注了@SpringBootConfiguration之后,本身其實(shí)也是一個(gè)ioc容器的配置類。
最終要的是@EnableAutoConfiguration這個(gè)注解,這個(gè)注解是SpringBoot自動(dòng)配置功能開(kāi)啟,是自動(dòng)裝配的核心注解,點(diǎn)進(jìn)去看下:
可以看到,@EnableAutoConfiguration這個(gè)注解使用了@AutoConfigurationPackage注解,還導(dǎo)入了一個(gè)AutoConfigurationImportSelector的類,先來(lái)看下@AutoConfigurationPackage注解,這個(gè)注解其實(shí)就是導(dǎo)入了一個(gè)AutoConfigurationPackages.Registrar.class的組件,如下圖:
可以看到這個(gè)類有兩個(gè)方法,主要看第一個(gè)方法:registerBeanDefinitions,顧名思義,這個(gè)方法就是用來(lái)注冊(cè)bean,register方法會(huì)掃描主配置類所在包及其子包下的組件,并注冊(cè)到IOC容器中。這就是@AutoConfigurationPackage注解的作用。
接下來(lái)看下導(dǎo)入的AutoConfigurationImportSelector類是做什么的,我們只用關(guān)注getCandidateConfigurations()這個(gè)方法:
在方法第一行打個(gè)斷點(diǎn)看一下:
可以看到,configurations里面,就是獲取的全類名集合,那么這些配置類是在哪里掃描到的呢?看下下面的報(bào)錯(cuò)提示信息就知道了,可以看到是在META-INF/spring.factories文件內(nèi)獲取的,而這個(gè)文件,就在當(dāng)前類所在的包:
看到這里,就比較清晰了,自動(dòng)裝配就是掃描到這些配置類,然后進(jìn)行裝配的。
來(lái)看下下面這個(gè)類是怎么裝配的:
下面標(biāo)記出來(lái)的這個(gè)注解就是裝配配置文件:
點(diǎn)進(jìn)去ServerProperties類看一下:
可以看到,這個(gè)類讀取配置文件以server開(kāi)頭,比如server.port、server.address等,這些配置文件是在當(dāng)前包下的spring-configuration-metadata.json里面:
點(diǎn)進(jìn)去可以看到很多json數(shù)據(jù):
搜索一下server.port、server.address:
通過(guò)這些json數(shù)據(jù)進(jìn)行相應(yīng)裝配,比如server.port,其實(shí)就是tomcat默認(rèn)的端口號(hào),有個(gè)defaultValue,默認(rèn)值就是8080。
總結(jié):
自動(dòng)配置,第一得益于能掃描主配置類所在包及其子包的組件,將這些組件注冊(cè)到IOC容器中,第二它能借助spring框架原有的SpringFactoriesLoader的支持,加載META-INF/spring.factories獲取組件的全類名并通過(guò)反射實(shí)例化為對(duì)應(yīng)的標(biāo)注了@Configuration的JavaConfig形式,并且符合要求@Conditional要求的IOC容器配置類,然后通過(guò)一些默認(rèn)值來(lái)進(jìn)行相應(yīng)初始化配置。
4、Spring Boot配置文件的優(yōu)先級(jí)
前面說(shuō)了每個(gè)Spring Boot項(xiàng)目都要依賴于spring-boot-starter-parent,看下spring-boot-starter-parent的pom文件:
可以看到,這里就是加載配置文件的地方,配置文件可以以application開(kāi)頭,yml、yaml、properties結(jié)尾,加載順序?yàn)閥ml -> yaml -> properties,后面的配置會(huì)覆蓋前面的配置,比如本項(xiàng)目有個(gè)yml配置文件,還有個(gè)properties配置文件,兩個(gè)配置文件內(nèi)都有server.port,yml里面的值為8081,properties里面的值為8082,那么啟動(dòng)項(xiàng)目之后tomcat的端口就是8082,會(huì)覆蓋掉yml里面的配置。
結(jié)尾
如果你覺(jué)得我的文章對(duì)你有幫助話,歡迎關(guān)注我的微信公眾號(hào):"一個(gè)快樂(lè)又痛苦的程序員"(無(wú)廣告,單純分享原創(chuàng)文章、已pj的實(shí)用工具、各種Java學(xué)習(xí)資源,期待與你共同進(jìn)步)
總結(jié)
以上是生活随笔為你收集整理的springboot 获取配置文件中的值_Spring Boot面试必问(亲测)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开发环境和运行环境的区别_生产环境 VS
- 下一篇: 寄存器在哪里_二、汇编之寄存器