SpringBoot配置文件、多環(huán)境配置、讀取配置的4種實(shí)現(xiàn)方式
一、寫(xiě)配置文件的位置
springboot官方規(guī)定了四個(gè)寫(xiě)配置文件的位置,位置如下:
- file指項(xiàng)目文件夾
- classpath指打包后生成的的target文件夾
讀取的優(yōu)先級(jí)
優(yōu)先級(jí)高會(huì)覆蓋優(yōu)先級(jí)低的相同配置,不同配置會(huì)互補(bǔ)。
1.文件位置:
如果這四個(gè)位置都有配置文件,會(huì)按照下圖的優(yōu)先級(jí)讀取。
2.文件名和文件后綴:
Spring Boot默認(rèn)會(huì)加載application.properties或application.yml文件,properties后綴的優(yōu)先級(jí)更高。
application.properties > application.ym
3.配置文件中的profile-specific文件:
可以根據(jù)激活的profile,如dev、prod等,在配置文件名后使用-{profile}來(lái)命名,這些profile-specific的配置文件將覆蓋通用的配置文件中的相同屬性。
例如:
- application-dev.properties
- application-prod.yml
4.命令行參數(shù)例如:application-dev.properties application-prod.yml
最后,在啟動(dòng)jar包或war包時(shí),可以指定參數(shù)值,命令行參數(shù)中指定的屬性會(huì)覆蓋之前加載的所有屬性。
# 設(shè)置環(huán)境變量 ENV SPRING_NACOS_SERVERADDRESS='nacos.xxx.xxx:8848' ENV SPRING_NACOS_NAMESPACE='merit-test' # 啟動(dòng)jar包命令 java -Xms228m -Xmx228m -Dspring.cloud.nacos.config.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.config.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.config.username=merit -Dspring.cloud.nacos.config.password=merit -Dspring.cloud.nacos.discovery.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.discovery.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.discovery.username=merit -Dspring.cloud.nacos.discovery.password=merit -jar /home/admin/merit-backend/merit-appraise-*.jar
二、多環(huán)境配置
開(kāi)發(fā)、測(cè)試、生產(chǎn)… ,多個(gè)環(huán)境下,如何指定不同環(huán)境的配置文件,使用spring.profiles.active屬性
1. properties
2. yaml
三、yaml配置文件
yaml支持多種數(shù)據(jù)結(jié)構(gòu),還支持表達(dá)式,但是對(duì)格式要求嚴(yán)格
- 大小寫(xiě)敏感
- 使用縮進(jìn)表示層級(jí)關(guān)系
- 縮進(jìn)時(shí)不允許使用Tab鍵,只允許使用空格。
- 縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)的元素左側(cè)對(duì)齊即可
1.字符串(String):表示文本數(shù)據(jù),可以使用單引號(hào)或雙引號(hào)括起來(lái)。
name: ginjiang # 如果字符串之中包含空格或特殊字符,需要放在引號(hào)之中 str: '內(nèi)容: 字符串' # 單引號(hào)之中如果還有單引號(hào),必須連續(xù)使用兩個(gè)單引號(hào)轉(zhuǎn)義 str: 'labor''s day' # 多行字符串:允許在YAML中表示跨越多行的字符串,使用管道符(|)或大于符號(hào)(>)進(jìn)行標(biāo)識(shí) description: | This is a multiline string in YAML.
2.數(shù)字(Number):表示數(shù)值數(shù)據(jù),可以是整數(shù)或浮點(diǎn)數(shù)。
age: 25 pi: 3.14159
3.布爾值(Boolean):表示邏輯值,可以是true或false。
isStudent: true hasCar: false
4.列表(List):表示有序的數(shù)據(jù)集合,使用短橫線(xiàn)(-)作為標(biāo)記,可以包含不同類(lèi)型的數(shù)據(jù)。
pets: - cat - dog - pig #行內(nèi)寫(xiě)法 pets: [cat,dog,pig]
5.字典(Dictionary)/映射(Mapping)/對(duì)象(Object):表示鍵值對(duì)的集合,使用冒號(hào)(:)分隔鍵和值。
student: name: qinjiang age: 3 #行內(nèi)寫(xiě)法 student: {name:qinjiang,age:3}
6.字典和列表嵌套
employees: - name: John age: 25 - name: Alice age: 30
7.空值(Null):表示空數(shù)據(jù),使用null或~表示。
address: null
8.時(shí)間(Time):表示時(shí)間數(shù)據(jù),使用ISO 8601格式表示。
timestamp: 2023-05-25T10:30:00Z
9.表達(dá)式
#自動(dòng)生成uuid name: ${random.uuid} #自動(dòng)生成隨機(jī)數(shù) name: ${random.int} #占位符:student.name有值就用student.name的值,沒(méi)有就用“小王” name: ${student.name:小王}
10.特殊值(Special Values):YAML支持一些特殊的值,如無(wú)窮大(Infinity)、負(fù)無(wú)窮大(Negative Infinity)、非數(shù)字(NaN)等。
special_values: - infinity: .inf - negative_infinity: -.inf - not_a_number: .nan
11.引用(References):YAML允許使用引用來(lái)引用其他節(jié)點(diǎn)的值,使用&符號(hào)定義引用,使用*符號(hào)引用引用的值。
person: &ref name: John age: 25 employee: details: *ref
yaml、properties、xml對(duì)比
特點(diǎn) | YAML | Properties | XML |
---|---|---|---|
語(yǔ)法結(jié)構(gòu) | 使用縮進(jìn)和冒號(hào)(:)表示層級(jí)關(guān)系 | 使用等號(hào)(=)或冒號(hào)(:)表示鍵值對(duì) | 使用標(biāo)簽和元素表示層級(jí)關(guān)系 |
數(shù)據(jù)類(lèi)型 | 支持多種數(shù)據(jù)類(lèi)型,如字符串、數(shù)字、布爾值等 | 鍵值對(duì) | 不直接支持?jǐn)?shù)據(jù)類(lèi)型,通過(guò)標(biāo)簽定義 |
可讀性 | 高 | 高 | 低 |
擴(kuò)展性 | 支持?jǐn)U展自定義數(shù)據(jù)類(lèi)型和對(duì)象結(jié)構(gòu) | 不支持 | 支持自定義標(biāo)簽和元素結(jié)構(gòu) |
嵌套支持 | 支持 | 不支持 | 支持 |
適用場(chǎng)景 | 配置文件、數(shù)據(jù)序列化和交換格式 | 簡(jiǎn)單配置文件和屬性管理 | 復(fù)雜數(shù)據(jù)交換和配置文件 |
四、讀取配置文件
1. @ConfigurationProperties(prefix=“key”)
配置文件的值自動(dòng)注入到實(shí)體中。
通過(guò)在類(lèi)上使用@ConfigurationProperties注解,并指定前綴,可以將配置文件中以該前綴開(kāi)頭的屬性值綁定到對(duì)應(yīng)的類(lèi)的屬性上。
2. @Value(“${key}”)
給每個(gè)屬性單獨(dú)賦值。
@Configuration public class Student{ @Value("${person.name}") private String name; }
3. Environment對(duì)象
通過(guò)注入Environment對(duì)象,使用getProperty方法獲取配置文件中的屬性值。
@Component public class MyComponent { @Autowired private Environment environment; public void someMethod() { String name = environment.getProperty("person.name"); } }
4. @PropertySource(value=“classpath:配置文件名”)
指定加載配置文件。
使用@Configuration注解和@PropertySource注解:在配置類(lèi)上使用@Configuration注解,并使用@PropertySource注解指定配置文件的位置。接著使用@Value注解或Environment對(duì)象來(lái)獲取屬性值。
@Configuration @PropertySource("classpath:my.properties") public class Student{ @Value("${person.name}") private String name; }
五、JSR303—參數(shù)驗(yàn)證
@Validated 是 Spring Framework 中的一個(gè)注解,它用于在方法參數(shù)、方法返回值或類(lèi)級(jí)別上啟用方法參數(shù)驗(yàn)證(Method Parameter Validation)。
它基于 JSR-303(Bean Validation)規(guī)范,提供了一種方便的方式來(lái)對(duì)方法參數(shù)進(jìn)行驗(yàn)證。
常用的驗(yàn)證注解
@NotNull
:驗(yàn)證參數(shù)值不為 null。@NotBlank
:驗(yàn)證字符串參數(shù)不為空(不為 null、不為空字符串、不包含空格)。@NotEmpty
:驗(yàn)證集合或數(shù)組參數(shù)不為空。@Min(value)
:驗(yàn)證數(shù)字參數(shù)的最小值。@Max(value)
:驗(yàn)證數(shù)字參數(shù)的最大值。@Size(min, max)
:驗(yàn)證字符串、集合或數(shù)組參數(shù)的長(zhǎng)度或大小是否在指定范圍內(nèi)。@Pattern(regex)
:驗(yàn)證字符串參數(shù)是否匹配指定的正則表達(dá)式。@Email
:驗(yàn)證字符串參數(shù)是否為有效的電子郵件地址。@Valid
:遞歸驗(yàn)證嵌套對(duì)象或集合的元素。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java xml出現(xiàn)錯(cuò)誤 javax.xml.transform.TransformerException: java.
這篇文章主要介紹了Java xml出現(xiàn)錯(cuò)誤 javax.xml.transform.TransformerException: java.lang.NullPointerException的相關(guān)資料,需要的朋友可以參考下2016-11-11Spring Boot整合RabbitMQ實(shí)例(Topic模式)
Topic Exchange 轉(zhuǎn)發(fā)消息主要是根據(jù)通配符。接下來(lái)通過(guò)本文給大家分享Spring Boot整合RabbitMQ實(shí)例(Topic模式),需要的朋友參考下吧2017-04-04Java 實(shí)戰(zhàn)范例之線(xiàn)上婚紗攝影預(yù)定系統(tǒng)的實(shí)現(xiàn)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+javaweb+SSM+springboot+mysql實(shí)現(xiàn)一個(gè)線(xiàn)上婚紗攝影預(yù)定系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11詳解Java實(shí)現(xiàn)緩存(LRU,FIFO)
本篇文章主要介紹了詳解Java實(shí)現(xiàn)緩存(LRU,FIFO) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04解決新版idea新建文件沒(méi)有XML和Resource Bundle文件問(wèn)題
這篇文章主要介紹了解決新版idea新建文件沒(méi)有XML和Resource Bundle文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07java jvm兩種存儲(chǔ)區(qū)的類(lèi)型知識(shí)點(diǎn)講解
在本篇文章里小編給大家整理的是一篇關(guān)于java jvm兩種存儲(chǔ)區(qū)的類(lèi)型知識(shí)點(diǎn)講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03多模塊項(xiàng)目使用枚舉配置spring-cache緩存方案詳解
這篇文章主要為大家介紹了多模塊項(xiàng)目使用枚舉配置spring-cache緩存的方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05