SpringBoot 配置文件使用詳解

一、創(chuàng)建一個SpringBoot項目#

創(chuàng)建 SprintBoot 項目的 2 種方式:

  1. https://start.spring.io/ 上創(chuàng)建一個 SpringBoot 項目,然后導入到 IDEA 里。
  2. 直接在 IDEA 上創(chuàng)建 SpringBoot 項目, File->New->Project, Sprint Initializr,填上相關信息。

我直接在 https://start.spring.io/ 生成一個項目然后下載下來,導入 IDEA 里。

把下載的文件解壓放在 SpringBootConfigDemos 文件夾下:

二、配置文件類型#

在上一小節(jié)的圖中可以看到,在 src/main/resources 目錄下的 application.properties 文件,這個就是創(chuàng)建的默認全局配置文件。

這是一種文件類型,以 .properties 后綴結(jié)尾。

還有一種以 .yml 后綴結(jié)尾的 YAML 文件類型 - application.yml/application.yaml。

YAML 是比 properties 格式更年輕,在云原生里用的很多這種配置格式。

三、配置文件語法格式#

3.1 application.properties 類型#

properties 在 java 里屬于比較常見的配置文件類型,語法格式: key=valve 形式,

Copy

`key=value`

用法例子:

Copy

`server.port = 80
server.ip = 127.0.0.1

app.property.key = proname
app.property.name = tom
app.list = 1,2,3

# 還有這樣語法
# 把啟動命令時加入: --spring.profiles.active=dev
spring.profiles.active = ${spring.profiles.active} # 讀取啟動命令參數(shù)

# 屬性占位符:使用${var}語法引用已經(jīng)定義的屬性的值
app.desc = your name is ${app.property.name}` 

3.2 application.yml 類型#

把上面 properties 格式改成 yml 格式:

Copy

`server:
  port: 80
  ip: 127.0.0.1

app:
  property:
    key: proname
    name: tom
  list: [1,2,3]
  desc: your name is ${app.property.name}

spring:
  profiles:
     active: ${spring.profiles.active}` 

比如對于一個數(shù)組,可以這樣寫:

Copy

`person:
  hobby:
    - 籃球
    - 跑步
    - 讀書` 

還可以這樣寫:

Copy

`person:
  hobby: [籃球, 跑步, 讀書]` 

YAML 支持以下幾種數(shù)據(jù)類型:

  • 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 數(shù)組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  • 純量(scalars):單個的、不可再分的值

YAML 入門教程:

說明:YAML 格式是大小寫敏感的。key: value 表示鍵值對關系,冒號后面必須加一個空格

3.3 配置隨機值#

SpringBoot 內(nèi)部提供了一個 random.* 屬性,專門用于生成隨機值。

屬性 描述
random.int 隨機產(chǎn)生正負的整數(shù)
random.int(max) 隨機產(chǎn)生 [0, max) 區(qū)間的整數(shù)
random.int(min,max) 隨機產(chǎn)生 [min, max) 區(qū)間的整數(shù)
random.long 隨機產(chǎn)生正負的長整數(shù)
random.long(max) 隨機產(chǎn)生 [0, max) 區(qū)間的長整數(shù)
random.long(min,max) 隨機產(chǎn)生 [min, max) 區(qū)間的長整數(shù)
random.uuid 產(chǎn)生 UUID 字符串(含‘-‘字符)
random.* ‘*’表示除上面列舉之外的其他字符,用于隨機產(chǎn)生 32 位字符串

配置例子:

Copy

`int-val=${random.int}
int-range-val=${random.int(2)}
uuid-val=${random.uuid}`

四、配置文件加載順序#

SpringBoot 啟動時會加載以下位置的 application.properties 或者 application.yml 作為默認配置文件。

  1. file:./config/
  2. file:./config/*/
  3. file:./
  4. classpath:/config/
  5. classpath:/

加載順序依次從上到下,所有文件都會加載,高優(yōu)先級的內(nèi)容會覆蓋低優(yōu)先級的內(nèi)容。

五、其它形式配置#

5.1 其它形式配置#

其實上面已經(jīng)有使用到,比如讀取命令行參數(shù)信息到配置文件里。這里的命令行參數(shù)也是一種動態(tài)配置信息。

其它常用配置形式:

  1. 系統(tǒng)環(huán)境變量:在 linux 中經(jīng)常用到這個。
  2. 命令行參數(shù):啟動應用時常常會配置的運行參數(shù)。
  3. Java 系統(tǒng)屬性:通過 System.getProperties() 獲取的。
  4. 一些注解設置的屬性文件,比如 @PropertySource 設置的屬性文件
  5. 啟動類 SpringApplication.setDefaultProperties 設置的默認屬性

5.2 加載順序怎樣#

  1. 命令行參數(shù)
  2. Java 系統(tǒng)屬性
  3. 系統(tǒng)環(huán)境變量
  4. 含有 random.* 值的屬性
  5. application-{profile}.{properties|yml}
  6. application.{properties|yml}
  7. 注解 @PropertySource 設置的屬性文件
  8. 啟動類 SpringApplication.setDefaultProperties 設置的默認屬性

加載順序依次從上到下。

六、配置信息作用#

  1. 數(shù)據(jù)庫連接信息保存

  2. 項目的啟動信息,比如 test,dev,prod 環(huán)境,端口信息等

  3. 一些自定義配置信息,比如文件上傳地址,調(diào)用第三方 url 地址、uid、密匙信息等

等等。

七:讀取配置文件#

7.0 綁定配置的一些規(guī)則#

SpringBoot 對 *.properties*.yml 文件中配置的屬性名稱,它提供了一些綁定規(guī)則,它不要求配置的屬性名稱完全與 Bean 中的屬性名稱相同。它支持以下幾種規(guī)則的命名方式:

屬性 描述
firstName 標準的駝峰式命名
first-name 單詞之間通過‘-‘分隔,Spring Boot 推薦這種
first_name 單詞之間通過‘_’分隔
FIRST_NAME 單詞全部大寫并通過‘_’分隔,在使用系統(tǒng)環(huán)境變量時,推薦這種

7.1 通過 @Value 注解讀取#

application.yml:

Copy

`server:
  port: 80
  ip:   127.0.0.1` 

通過使用注解 @Value("${屬性名稱}") 來將配置文件里面的值注入到程序?qū)傩灾小?/p>

Copy

`@Component
public class ServerConfig {

    @Value("${server.port}")
    public String Port;

    @Value("${$server.ip}")
    public String IP;
}`

7.2 通過 @ConfigurationProperties 注解讀取#

7.2.1 @ConfigurationProperties 讀取配置值#

@ConfigurationProperties:將配置文件中的相關配置和類里面的屬性進行綁定。

它里面有一個參數(shù),當然這個參數(shù)也可以不填,語法如下:

Copy

`@ConfigurationProperties(prefix = "xxx")` 

上面的 application.yml 里值也可以用如下程序來讀?。?/p>

Copy

`@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {

    public String port;

    public String ip;
}` 
  • 來一個比較復雜點例子:

application.yml 文件:

Copy

`server:
  port: 80
  ip:   127.0.0.1
  list-server:
     - BJ-Server
     - GZ-Server
  map-server: {bj-server: 192.168.0.2, gz-server: 192.168.0.3}
  dns:
     bj: bj.dns.one
     gz: gz.dns.two
  arr-port: 8081, 8082` 

讀取配置文件:

Copy

`@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {

    public String port;
    public String ip;
    private List<String> listServer;
    private Map<String, String> mapServer;
    private int[] arrPort;

    private Dns dns;

    public static class Dns {
        private String bj;
        private String gz;
    }
}` 

上面的也可以用 @Value 讀取,程序跟前面例子一樣。

7.2.2 @Value 和 @ConfigurationProperties 區(qū)別#

@ConfigurationProperties @Value
功能 批量注入配置文件中的屬性 一個個指定屬性
松散綁定 支持 不支持
SPEL(計算式) 不支持 支持
JSR303數(shù)據(jù)校驗 支持 不支持
復雜類型 支持 不支持

7.3 @PropertySource 加載指定配置文件#

@PropertySource("email-config.properties"),加載 email-config.properties 配置文件。

同理也可以加載 .yml 的文件。

email-config.properties:

Copy

`email.name = jimmy
email.from = 123@test.com
email.to = 567@yeah.com` 

讀取配置文件值:

Copy

`@Component
@PropertySource("email-config.properties")
@ConfigurationProperties(prefix = "email")
public class EmailConfig {
    private String name;
    private String to;
    private String from;
}`
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容