SpringBoot如何配置文件properties和yml
配置文件的作用
通常情況下,一個項目中的一些重要信息都會放在配置文件中
比如:數(shù)據(jù)庫的連接信息、項目的啟動端口、一些第三方的秘鑰、記錄信息的普通日志和異常日志等。
SprintBoot的配置文件(兩種)
Spring Boot的配置文件主要有兩種格式:
.properties和.yml
這兩種格式的配置文件可以共同存在于一個項目中,但一般情況下我們會統(tǒng)一格式,只使用其中的一種,來降低故障率。
.properties是最早期的SpringBoot配置文件的格式,也是現(xiàn)在默認的配置文件格式,出現(xiàn)的時間早于.yml。
當這兩個配置文件中出現(xiàn)相同的配置時,會優(yōu)先執(zhí)行.properties中的配置,然后再執(zhí)行.yml中的配置,即.properties的優(yōu)先級大于.yml
properties
創(chuàng)建SpringBoot項目后會自動生成一個配置文件,在該文件中,信息以鍵值對的形式進行儲存。
# 配置項目的信息 # key=value server.port=8080 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb? characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root
如果我們想要在這個文件中配置一些信息,可以在遵循key-value格式下,可以定義任意名稱的key
缺點:
對于同一個對象的多個屬性進行設置時很麻煩,需要多次重復,存在冗余配置項。
如下,當我們想要設置同一個對象很多的信息時,需要多次重復這個信息:
而yml就很好的解決了這個問題。
yml
yml是YMAL的縮寫,全稱是 Yet Another Markup Language
,另一種標記語言。
YMAL是一個可讀性高、易于理解、用來表達數(shù)據(jù)序列化的格式。
YMAL的作用是可以做到跨語言使用,不僅Java中可以使用,Go和python中都可以使用。
1.語法格式:
- key: value表示鍵值對關系,冒號后面必須加一個空格
- 大小寫敏感
- 縮進時不允許使用tab鍵,只能用空格
- 左對齊的一列數(shù)據(jù)就表示同一級
- 松散表示,java使用駝峰命名,而用原名或者-代替都可以正確映射,比如java中的名稱是lastName,yml中使用lastName或者last-name都可以映射到。
2.鍵值關系
# 通常寫法: student: id: 1 name: 張三 age: 20 # 行內寫法 student: { id: 1,name: 張三, age: 20}
yml中,字符串默認不需要加上單引號或者雙引號
- 使用雙引號:不會轉義字符串中的特殊字符,特殊字符會作為本身想要表達的意思:比如 name: “zhangsan \n 23”,會輸出:zhangsan 換行 23
- 使用單引號:會轉義特殊字符,特殊字符失去特殊作用變成普通字符。
在配置文件中,它是以鍵值對的形式儲存信息的,如果是自己配置的信息,你可以在遵循key-value的格式下,定義任何名稱的key.
使用YML連接數(shù)據(jù)庫:
sping: datasource: url:jdbc: mysql://127.0.0.0:3306/dbname?characterEncoding=tuf8 username: root password: root
表示常用的字面量:
# 普通字面量 name: zhangsan age: 18 #布爾類型 flag: true #日期 date: 2022/04/15 # 同一個對象的多個屬性 people: name: lisi age: 20 # 數(shù)組 # 用 -表示數(shù)組中的一個元素 pets: - cat - dog - pig # 行內寫法 petss: [dog,cat,pig] # list對象、set對象、數(shù)組對象 students: - name: zhangsan age: 22 - name: lisi age: 20 - {name: wangwu,age: 18}
讀取配置文件的方法:
@Value注解讀取單個配置項
如果我們想要主動的讀取配置文件中的信息,可以使用注解@Value。
使用格式:
@Value("${server.port}") private String port;
在屬性前加上@Value注解,后面的括號寫入要讀取的配置中哪個key,比如讀取下面的server.port,注意格式:雙引號+${}
# 配置項目端口 server.port=8080
在測試類中得到這個值并進行打印:
package com.example.demo; import Controller.TestReadYml; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication implements InitializingBean { @Value("${server.port}") private String port; public static void main(String[] args) { SpringApplication.run(DemoApplication.class,args); } @Override public void afterPropertiesSet() throws Exception { System.out.println(" "); System.out.println("讀取到信息:"+port); System.out.println(" "); } }
輸入:
@ConfigurationProperties讀取實體類
1.將配置文件中的一組對象映射到實體類上:
使用格式:
@Component //spring 啟動時直接將配置文件映射到當前類屬性上 @ConfigurationProperties("student") //student是在配置好的key
舉例:
在yml配置文件中,我們創(chuàng)建一個student對象:
student: id: 1 name: 張三 age: 20
將這個對象映射到Student類中,也就是從配置文件里讀取到類中,
package model; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component //spring 啟動時直接將配置文件映射到當前類屬性上 @ConfigurationProperties("student") public class Student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
2.使用注入的方式將對象注入到一個類中
在啟動類中注入Student類進行使用:
package com.example.demo; import com.example.demo.model.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @SpringBootApplication @Component public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class,args); } //屬性注入 @Autowired private Student student; @PostConstruct private void postConstruct(){ System.out.println("Read Yml:"+student); } }
輸出:
Read Yml:Student{id=1, name='張三', age=20}
注意包路徑配置的問題!??!
啟動類和要注入的類包必須放在同級目錄下,否則讀取不到,會顯示啟動失敗Application failed to start.
properties VS yml 總結
- yml語法更簡潔,可以解決數(shù)據(jù)冗余問題
- yml跨語言的通用性更好,它不支持java語言還支持golang 和python
- yml 支持更多的數(shù)據(jù)類型
- yml格式的配置文件在寫的時候更容易出錯(冒號后面需要加一個空格),而properties雖然寫法更復雜但是不容易出錯。
- yml雖然可以和properties共存,但一個項目中最好統(tǒng)一格式,只用其中的一個。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- springboot如何獲取yaml/yml(或properties)配置文件信息
- SpringBoot中application.properties、application.yaml、application.yml區(qū)別
- springboot之Duration(java.time.Duration)在yml properties中的配置方式
- SpringBoot中application.properties與application.yml區(qū)別小結
- SpringBoot的配置文件(properties與yml)使用方法
- SpringBoot中properties,yml,yaml的區(qū)別及使用說明
相關文章
java在linux系統(tǒng)下開機啟動無法使用sudo命令的原因及解決辦法
每次開機自動啟動的java進程,頁面上的關機按鈕都無法實現(xiàn)關機功能,但是此時如果以chb賬號通過ssh登錄該服務器,手動殺掉tomcat進程,然后再重新啟動tomcat,頁面上的關機按鈕就有效了2013-08-08Java數(shù)據(jù)結構之優(yōu)先級隊列(PriorityQueue)用法詳解
優(yōu)先級隊列是一種先進先出的數(shù)據(jù)結構,操作的數(shù)據(jù)帶有優(yōu)先級,這種數(shù)據(jù)結構就是優(yōu)先級隊列(PriorityQueue)。本文將詳細講講Java優(yōu)先級隊列的用法,感興趣的可以了解一下2022-07-07Spring Boot 約定大于配置之如何實現(xiàn)自定義配置
本文介紹了SpringBoot的“約定大于配置”理念以及如何實現(xiàn)自定義配置,通過實現(xiàn)接口和添加@Configuration注解,開發(fā)者可以靈活地擴展和定制SpringBoot的默認行為,感興趣的朋友一起看看吧2025-03-03