文章使用版本為 Spring Boot 2.1.x
對(duì)應(yīng)進(jìn)階系列 Spring Boot 進(jìn)階系列(二) 配置文件
前言
寫(xiě)項(xiàng)目的時(shí)候少不了需要根據(jù)不同的運(yùn)行環(huán)境使用不同參數(shù)的情況,比如開(kāi)發(fā)環(huán)境使用開(kāi)發(fā)數(shù)據(jù)庫(kù)河劝,測(cè)試環(huán)境使用測(cè)試數(shù)據(jù)庫(kù),生產(chǎn)環(huán)境使用生產(chǎn)數(shù)據(jù)庫(kù)讯检。為了避免硬編碼,通常我們會(huì)把這些需要隨著運(yùn)行環(huán)境變化而變化的參數(shù)配置到配置文件中去孝扛,在 Spring Boot(一) Hello World中介紹過(guò)我們使用application.yml(或者application.properties)來(lái)保存我們的配置參數(shù)旺坠,現(xiàn)在我們來(lái)詳細(xì)學(xué)習(xí)下配置文件。
Spring Boot 自帶的可配置參數(shù)
spring boot 自帶了許多可配置的參數(shù)馋缅,具體可以參考spring-boot-autoconfig-x.x.x.RELEASE.jar => MATA-INFO => spring-configuration-matadata.json
,屬性很多绢淀,我們就不一一介紹萤悴,這里我們只選取一個(gè)來(lái)做講解。
server:
port: 就是我們的web服務(wù)啟動(dòng)的端口皆的,默認(rèn)值8080
大家可以試一下覆履,什么參數(shù)都不配置,啟動(dòng)項(xiàng)目,觀察啟動(dòng)日志硝全,看看服務(wù)啟動(dòng)的端口是不是8080栖雾;如果不想使用默認(rèn)值8080,就需要我們?cè)谂渲梦募惺謩?dòng)配置伟众,比如配置成8090析藕,重新啟動(dòng)項(xiàng)目,觀察下是否在8090端口啟動(dòng)凳厢。
自定義配置
spring boot自帶的配置能夠讓我們配置整個(gè)項(xiàng)目的基本參數(shù)账胧,但是如果我們需要配置一些和業(yè)務(wù)相關(guān)的參數(shù),spring boot就無(wú)能為力了先紫,這個(gè)時(shí)候需要我們自定義配置找爱,比如如下配置
someone:
name: 張三
age: 20
best-friend: 李四
那么在配置文件里配置的參數(shù)如何在項(xiàng)目中使用呢?一般有2中辦法
- 通過(guò)
@Value
注入到程序中泡孩,這種方法適合參數(shù)比較少,或者參數(shù)間沒(méi)什么關(guān)聯(lián)的情況
@Value("${someone.name}")
private String name;
@Value("${someone.age}")
private String age;
@Value("${someone.best-friend}")
private String bestFriend;
- 如果你的參數(shù)非常多寺谤,且有非常強(qiáng)的關(guān)聯(lián)性仑鸥,使用上一種方法顯得比較繁瑣,這時(shí)候我們可以通過(guò)
@ConfigurationProperties
一次性把參數(shù)注入到Bean中变屁。
package org.schhx.springbootlearn.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "someone")
@Component
@Data
public class SomeoneProperties {
private String name;
private Integer age;
private String bestFriend;
}
然后在使用的地方把Bean直接注入進(jìn)來(lái)就可以使用所有參數(shù)了
@Autowired
private SomeoneProperties someoneProperties;
多環(huán)境配置
現(xiàn)在我們已經(jīng)知道了如何配置參數(shù)眼俊,那么如何才能讓開(kāi)發(fā)環(huán)境使用開(kāi)發(fā)環(huán)境的參數(shù),測(cè)試環(huán)境使用測(cè)試環(huán)境的參數(shù)呢粟关?答案就是配置多個(gè)配置文件疮胖,然后指定使用一個(gè)。
我們現(xiàn)在已經(jīng)有了application.yml闷板,現(xiàn)在我們?cè)傩陆◣讉€(gè)文件application-default.yml澎灸、application-dev.yml、application-test.yml遮晚、application-prod.yml性昭。然后在application.yml添加一個(gè)參數(shù)
spring:
profiles:
active: dev
它表示我們現(xiàn)在使用application-dev.yml這個(gè)配置文件,當(dāng)然你也可以不配置县遣,默認(rèn)使用的是application-default.yml糜颠。
需要說(shuō)明的是,使用了application-*.yml并不是說(shuō)application.yml就不起作用了萧求,應(yīng)該是兩個(gè)都起作用其兴,只不過(guò)application-*.yml優(yōu)先級(jí)比較高,它會(huì)覆蓋掉application.yml中的同名屬性夸政。
我們可以做下測(cè)試元旬,在application.yml中配置以下參數(shù)
spring:
profiles:
active: dev
server:
port: 8090
someone:
name: 張三
age: 20
best-friend: 李四
在application-dev.yml中配置以下參數(shù)
server:
port: 8081
啟動(dòng)項(xiàng)目,可以看到項(xiàng)目在8081端口啟動(dòng)
2018-01-21 09:35:46.725 INFO 22526 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
然后訪問(wèn)someone的參數(shù),可以看到法绵,雖然application-dev.yml沒(méi)有配置someone箕速,我們依然可以訪問(wèn)到,說(shuō)明application.yml配置的參數(shù)依然有效朋譬。
Properties from @Value
name = 張三
age = 20
bestFriend = 李四
Properties from bean
SomeoneProperties(name=張三, age=20, bestFriend=李四)
一般我們可以把不隨著環(huán)境變化而變化的參數(shù)放在application.yml中盐茎,而那些隨著環(huán)境變化的參數(shù)放到application-*.yml當(dāng)中去。
使用命令行配置參數(shù)
除了使用配置文件徙赢,我們還可以使用命令行參數(shù)來(lái)來(lái)配置參數(shù)字柠。雖然我們?cè)赼pplication.yml中指定了使用的profile,但是這個(gè)是硬編碼進(jìn)去的狡赐,我們不可能每次換環(huán)境部署都去更改application.yml窑业,這時(shí)候我們就需要在命令行指定需要激活的profile。
java -jar target/spring-boot-config.jar --spring.profiles.active=test
啟動(dòng)項(xiàng)目枕屉,可以發(fā)現(xiàn)項(xiàng)目在8082端口啟動(dòng)
2018-01-21 09:54:43.374 INFO 22595 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8082 (http)
配置參數(shù)的優(yōu)先級(jí)
通過(guò)上面的學(xué)些我們應(yīng)該知道了參數(shù)優(yōu)先級(jí)的順序是
命令行參數(shù) > application-\*.yml > application.yml
現(xiàn)在我們?cè)賮?lái)試驗(yàn)下常柄,使用命令行啟動(dòng)項(xiàng)目
java -jar target/spring-boot-config.jar --spring.profiles.active=test --server.port=9090
可以看到項(xiàng)目在命令行指定的9090端口啟動(dòng)
2018-01-21 09:59:23.812 INFO 22609 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 9090 (http)
總結(jié)
我們主要學(xué)習(xí)了
- 配置spring boot自帶的參數(shù)
- 配置自定義參數(shù),并使用2種方法讀取
- 多環(huán)境下如何配置和使用參數(shù)
- 使用命令行配置參數(shù)
- 介紹了多種方式配置參數(shù)的優(yōu)先級(jí)