SpringBoot入門建站全系列(二十三)配置文件優(yōu)先級(jí)及自定義配置文件
時(shí)間:2023-07-08 07:30:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-07-08 07:30:01 來源:網(wǎng)站運(yùn)營
SpringBoot入門建站全系列(二十三)配置文件優(yōu)先級(jí)及自定義配置文件:
SpringBoot入門建站全系列(二十三)配置文件優(yōu)先級(jí)及自定義配置文件
一、概述
Spring Boot允許多種配置來源,官網(wǎng)是這樣說的:
Spring Boot使用一種非常特殊的PropertySource順序,旨在允許合理地覆蓋值。按以下順序考慮屬性(優(yōu)先級(jí)從高到低):
- Devtools 主目錄上的全局設(shè)置屬性(~/.spring-boot-devtools.properties當(dāng)devtools處于活動(dòng)狀態(tài)時(shí))。
- @TestPropertySource 你的測試注釋。
- properties屬性測試???用于測試特定應(yīng)用程序片段@SpringBootTest的 測試注釋。
- 命令行參數(shù)。
- 來自SPRING_APPLICATION_JSON(嵌入在環(huán)境變量或系統(tǒng)屬性中的內(nèi)聯(lián)JSON)的屬性。
- ServletConfig init參數(shù)。
- ServletContext init參數(shù)。
- JNDI屬性來自java:comp/env。
- Java系統(tǒng)屬性(System.getProperties())。
- OS環(huán)境變量。
- RandomValuePropertySource,只有在擁有random.*屬性。
- 特定于配置文件的應(yīng)用程序?qū)傩栽诖虬膉ar(application-{profile}.properties和YAML變體)之外。
- 打包在jar中的特定于配置文件的應(yīng)用程序?qū)傩裕╝pplication-{profile}.properties 以及YAML變體)。
- 打包jar之外的應(yīng)用程序?qū)傩裕╝pplication.properties以及YAML變體)。
- 打包在jar中的應(yīng)用程序?qū)傩裕╝pplication.properties和YAML變體)。
- @PropertySource 在@Configuration類上的注釋。
- 默認(rèn)屬性(由設(shè)置指定SpringApplication.setDefaultProperties)。
事實(shí)上,這個(gè)地方還少了一個(gè),那就是配置中心,配置中心的優(yōu)先級(jí)是最高的,還可以動(dòng)態(tài)刷新,可以參考《SpringCloud技術(shù)指南系列(八)配置管理之Consul配置中心》配置中心的使用。
而且,我們常用的,一般有命令行參數(shù)、application-{profile}.properties和application.properties。自定義配置文件用的也不多,但是還是有人用的。
本篇著重講述下常用的配置方式。
首發(fā)地址: 品茗IT-同步發(fā)布
如果大家正在尋找一個(gè)java的學(xué)習(xí)環(huán)境,或者在開發(fā)中遇到困難,可以加入我們的java學(xué)習(xí)圈,點(diǎn)擊即可加入,共同學(xué)習(xí),節(jié)約學(xué)習(xí)時(shí)間,減少很多在學(xué)習(xí)中遇到的難題。二、命令行參數(shù)
默認(rèn)情況下,SpringApplication將任何命令行選項(xiàng)參數(shù)(即,以--開頭的參數(shù),如--server.port=9000)轉(zhuǎn)化為property,并將它們添加到spring Environment。如前所述,命令行屬性始終優(yōu)先于其他屬性源。
如果您不希望將命令行屬性添加到Environment,則可以使用禁用它們SpringApplication.setAddCommandLineProperties(false)。
三、主配置文件
3.1 主配置常用配置
SpringApplication從application.properties以下位置的文件加載屬性并將它們添加到Spring Environment:(優(yōu)先級(jí)從高往低)
- Jar包同級(jí)目錄/config
- Jar包同級(jí)目錄
- classpath 下的/config
- classpath根路徑 /
如果你不喜歡properties文件,可以使用YAML替代properties文件,加載順序什么都是一樣的,只不過寫法不一樣。 下面是兩種寫法的不同:
properties文件:
server.port=8858spring.profiles.active=loc
yaml文件
server: port: 8812spring: profiles: active: loc
yaml文件看起來簡潔明了,properties文件看起來一坨一坨的,但是我更喜歡properties文件,因?yàn)閥aml文件對(duì)語法要求嚴(yán)格,tab鍵和空格鍵入的內(nèi)容都不一樣,很容易出錯(cuò)。
3.2 主配置替換
這種配置方法很少使用,可以說基本上沒人用。
如果您不喜歡application.properties配置文件名,可以通過指定spring.config.name環(huán)境屬性切換到另一個(gè)文件名。您還可以使用spring.config.location屬性(以逗號(hào)分隔的目錄位置或文件路徑列表)來引用顯式位置。spring.config.additional-location來指定額外配置文件。
spring.config.name的作用就是給application.properties換個(gè)名。
spring.config.location就是指定了加載配置文件的路徑。就是不再從上面說的那個(gè)路徑取配置文件。
spring.config.additional-location就是指定了額外配置文件的加載路徑。除了在上面的在默認(rèn)位置搜索配置文件,還搜索這個(gè)配置指定的位置的配置文件。而且優(yōu)先級(jí)最高。
這三個(gè)配置都不能寫在應(yīng)用里,因?yàn)樗窃趹?yīng)用啟動(dòng)前就確定的,需要在環(huán)境變量或者命令行參數(shù)確定。四、其他配置文件
如果我們在application.properties中寫入了太多配置,想用其他配置文件來寫配置時(shí),就需要考慮下如何加載這些配置文件。
4.1 指定配置文件加載
指定配置文件加載,就是指application-{profile}.properties和YAML變體 這種形式。
一直以來,我一直對(duì)這種形式存在誤解,以為它只能區(qū)分環(huán)境,后來才發(fā)現(xiàn),自己錯(cuò)了,這個(gè)只是純粹的指向新的配置文件,你指了哪個(gè),哪個(gè)就能加載。下面說下它分別怎么用。
區(qū)分環(huán)境:- 比如有三個(gè)環(huán)境的配置文件application-loc.properties,application-dev.properties,application-prod.properties,沒有固定位置,只要放在Spring能加載的位置即可,一般放在application.properties的低一級(jí)目錄,方便區(qū)分,比如application.properties放在classpath下,這些配置文件可以放在config/目錄下。
- 在命令行參數(shù),或者application.properties中,使用spring.profiles.active=loc指定要來指定加載application-loc.properties配置文件。其他雷同。
區(qū)分應(yīng)用:- 比如我們有用到redis,我們想把redis的配置單獨(dú)出去,不想放在application.properties里面變一坨。就可以單獨(dú)新建配置文件application-redis.properties,放在Spring能加載的位置。
- application.properties中(這個(gè)就沒必要放命令行參數(shù)了,因?yàn)槲覀儜?yīng)用里面肯定要用到的),使用spring.profiles.active=loc,redis指定要來指定加載application-redis.properties配置文件。
- 如果使用命令行參數(shù)傳遞的spring.profiles.active=loc,可能會(huì)覆蓋掉配置文件中的redis配置,這時(shí)候,我們可以使用spring.profiles.include配置,疊加激活profile,如果配置spring.profiles.include=redis,指定spring.profiles.active=loc,就可以同時(shí)激活loc,redis,等同于spring.profiles.active=loc,redis。
4.2 自定義配置文件加載
自定義配置文件,就是定義的配置文件命名規(guī)范不再遵循Spring boot的要求,自由加載。需要使用@PropertySource注解加載配置文件。
- 先在classpath下建個(gè)配置文件,如user.properties。
user.properties:
user.username=cffuser.realName=大爺user.mobile=23333hello.message=sssssssssssssssssssaasa
- 使用@PropertySource("classpath:user.properties")加載配置,同時(shí)使用@ConfigurationProperties自動(dòng)綁定屬性,當(dāng)然也可以使用@Value來注入配置。
代碼示例:
package cn.pomit.springbootwork.consulclient.service;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;@Configuration@ConfigurationProperties(prefix="user")@PropertySource("classpath:user.properties")public class UserConfig { private String userName; private String realName; private Integer mobile; private String message; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public Integer getMobile() { return mobile; } public void setMobile(Integer mobile) { this.mobile = mobile; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String toString() { return "UserConfig [userName=" + userName + ", realName=" + realName + ", mobile=" + mobile + ", message=" + message + "]"; }}
這樣就可以直接使用user.properties配置文件中的配置,這里有注意事項(xiàng):
- 只有@PropertySource,是不能加載配置的。
- @ConfigurationProperties(prefix="user") 只綁定了user.開頭的屬性。
- @Value 可以注入任何屬性。
- @ConfigurationProperties和@Value的不同是,@ConfigurationProperties支持屬性綁定,@Value不行,但是@Value支持el表達(dá)式,@ConfigurationProperties不支持。
五、Jar包外的配置文件
- Spring boot默認(rèn)讀取jar包當(dāng)前目錄下的application.properties配置文件,以及config下的application.properties文件。
- 也可以使用spring.config.location替換加載配置文件的路徑。
- 也可以使用spring.config.additional-location來指定了額外配置文件的加載路徑。
- 使用@PropertySource(value={"file:D:/test/user.properties"}) 這種形式,指定文件是D:/test目錄下的user.properties文件。也可以把D:/test/寫在配置文件中,如用out.profile.path=D:/test 指定,然后使用@PropertySource(value={"file:${out.profile.path}/user.properties"}) 來指定外部配置文件。
品茗IT-博客專題:https://www.pomit.cn/lecture.html匯總了Spring專題、Springboot專題、SpringCloud專題、web基礎(chǔ)配置專題。
快速構(gòu)建項(xiàng)目
Spring組件化構(gòu)建
SpringBoot組件化構(gòu)建
SpringCloud服務(wù)化構(gòu)建
喜歡這篇文章么,喜歡就加入我們一起討論SpringBoot使用吧!
關(guān)鍵詞:文件,配置,優(yōu)先,定義,入門,系列