SpringBoot系列(八):Spring Boot微服務(wù)項(xiàng)目配置文件詳解


作者: 修羅debug
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

摘要:本文我們將詳細(xì)分享介紹如何基于Spring Boot搭建的項(xiàng)目使用其配置文件,其中內(nèi)容將包括如何讀取配置文件中變量的值,如何將配置文件中變量的值映射為Java Bean,如何加載使用自定義的配置文件以及如何進(jìn)行多環(huán)境的切換!

內(nèi)容:在有些情況下,我們不希望直接在代碼里寫死“屬于配置”的東西,比如常見的數(shù)據(jù)庫(kù)連接信息、第三方平臺(tái)授權(quán)賬號(hào)密鑰信息等等,而更多的是希望將這些信息放在某個(gè)地方,可供我們動(dòng)態(tài)、靈活地進(jìn)行修改,一般情況下,這個(gè)地方指的便是“配置文件”!

下面我們將基于前文Spring Boot搭建的項(xiàng)目使用配置文件,其中,將主要從以下幾個(gè)方面進(jìn)行展開講解:

(1)如何讀取配置文件中變量的值

(2)如何將配置文件中變量的值映射為Java Bean

(3)如何加載使用自定義的配置文件

(4)如何進(jìn)行多環(huán)境的切換

廢話不多講,咱們直接進(jìn)入代碼實(shí)戰(zhàn)環(huán)節(jié)。

一、“如何讀取配置文件中變量的值”:可以通過(guò)@Value(“${}”)或者Environment對(duì)象實(shí)例提供的api進(jìn)行獲取。

(1)首先是在application.properties配置文件中 加入以下的配置信息:

order.title=訂單標(biāo)題
order.info=訂單詳情
order.price=45.5
order.id=10

(2)然后是建議一個(gè)PropertyController,編寫一個(gè)請(qǐng)求方法,其源代碼如下所示:  

@RestController
@RequestMapping("order")
public class PropertyController {
//從配置文件中讀取變量的值的第一種方式
@Value("${order.title}")
private String orderTitle;

@Value("${order.id}")
private Integer orderId;

@GetMapping("info/1")
public BaseResponse info1(){
BaseResponse response=new BaseResponse(StatusCode.Success);
Map<String,Object> resMap= Maps.newHashMap();
try {
resMap.put("orderTitle",orderTitle);
resMap.put("orderId",orderId);

response.setData(resMap);
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}

//從配置文件中讀取變量的值的第二種方式
@Autowired
private Environment env;

@GetMapping("info/2")
public BaseResponse info2(){
BaseResponse response=new BaseResponse(StatusCode.Success);
Map<String,Object> resMap= Maps.newHashMap();
try {
resMap.put("orderInfo",env.getProperty("order.info"));
resMap.put("orderPrice",env.getProperty("order.price",Double.class));

response.setData(resMap);
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}
}

(3)將項(xiàng)目跑起來(lái),然后分別發(fā)起請(qǐng)求:http://localhost:8081/technology/order/info/1 、

http://localhost:8081/technology/order/info/2 可以分別得到如下兩張圖的響應(yīng)結(jié)果,如下兩張圖所示:





二、“如何將配置文件中變量的值映射為Java Bean”:可以通過(guò)@ConfigurationProperties + @Component 注解的方式實(shí)現(xiàn)這種效果

(1)我們?nèi)匀灰陨厦媾渲梦募pplication.properties中配置的變量值為例:

order.title=訂單標(biāo)題
order.info=訂單詳情
order.price=45.5
order.id=10

如果此時(shí),order.xxx還有10幾個(gè),而我們?nèi)匀徊捎聾Value或者Environment進(jìn)行讀取的話,那將會(huì)是件“蛋疼”的事情(要知道,程序員是最會(huì)、最想偷懶的!)故而,我們會(huì)想辦法,能不能將這些屬于order 實(shí)體的信息歸結(jié)到一個(gè)“類”中去呢?

答案是顯然可以!

我們可以采用 @ConfigurationProperties + @Component 注解的方式 實(shí)現(xiàn) 配置文件中變量自動(dòng)映射為Java Bean,如下代碼所示:

@ConfigurationProperties(prefix = "order")
@Component
@ToString
@Data
public class OrderDto implements Serializable{
private String title;
private String info;
private Double price;
private Integer id;
}

最后,我們是在PropertyController中開發(fā)一個(gè)請(qǐng)求方法,其完整源代碼如下所示:  

    @Autowired
private OrderDto orderDto;

@GetMapping("info/3")
public BaseResponse info3(){
BaseResponse response=new BaseResponse(StatusCode.Success);
Map<String,Object> resMap= Maps.newHashMap();
try {
resMap.put("orderDto",orderDto);
resMap.put("orderDto的id",orderDto.getId());

response.setData(resMap);
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}

(2)將項(xiàng)目跑起來(lái),然后發(fā)起請(qǐng)求:http://localhost:8081/technology/order/info/3 可以得到如下圖的響應(yīng)結(jié)果,如下圖所示:  



三、“如何加載使用自定義的配置文件”:可以通過(guò)@ConfigurationProperties + @PropertySource(value = "classpath:配置文件所在位置") + @Component 組合注解的方式進(jìn)行實(shí)現(xiàn)。

(1)首先,先在application.properties同目錄下新建一個(gè)新的配置文件handsome.properties,在該配置文件中加入如下的變量配置信息:

www.baidu.com.title=百度
www.baidu.com.age=20

  然后,創(chuàng)建一個(gè)實(shí)體類HandsomeDto,其完整源代碼如下所示:  

@Data
@ToString

@ConfigurationProperties(prefix = "www.baidu.com")
@PropertySource(value = "classpath:handsome.properties")
@Component
public class HandsomeDto implements Serializable{
private String title;
private Integer age;
}


即主要是加入@PropertySource(value = "classpath:handsome.properties") 的配置信息,將指定的配置文件加載進(jìn)來(lái)!  同樣的道理,我們?cè)赑ropertyController中開發(fā)一個(gè)新的請(qǐng)求方法,如下所示:

    @Autowired
private HandsomeDto handsomeDto;

@GetMapping("info/4")
public BaseResponse info4(){
BaseResponse response=new BaseResponse(StatusCode.Success);
Map<String,Object> resMap= Maps.newHashMap();
try {
resMap.put("handsomeDto",handsomeDto);
resMap.put("handsomeDto的title",handsomeDto.getTitle());

response.setData(resMap);
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}

(2)將項(xiàng)目跑起來(lái),然后發(fā)起請(qǐng)求:http://localhost:8081/technology/order/info/4 可以得到如下圖的響應(yīng)結(jié)果,如下圖所示:  



四、“如何進(jìn)行多環(huán)境的切換”:可以直接在配置文件application.properties中動(dòng)態(tài)切換這個(gè)變量的值,如果 spring.profiles.active=prod,表示應(yīng)用將切換到生產(chǎn)環(huán)境(讀取的配置文件將為 application-prod.properties ;如果 spring.profiles.active=test,表示應(yīng)用將切換到測(cè)試環(huán)境(讀取的配置文件將為 application- test.properties)

(1)只需要在配置文件application.properties中動(dòng)態(tài)調(diào)整變量 pring.profiles.active 的取值即可,如果為prod,則代表“生產(chǎn)環(huán)境”(application-prod.properties),如果為“test”,則代表“測(cè)試環(huán)境”(application-test.properties),如果為“dev”,則代表“開發(fā)環(huán)境”(application-dev.properties)

為了更好的進(jìn)行測(cè)試,我們?cè)赼pplication-prod.properties配置文件中添加如下的配置信息:

order.title=訂單標(biāo)題-生產(chǎn)環(huán)境
order.info=訂單詳情-生產(chǎn)環(huán)境
order.price=46
order.id=11


用于覆蓋配置文件application.properties 中相對(duì)應(yīng)的配置信息,并設(shè)置 spring.profiles.active=prod ,即代表此時(shí)啟動(dòng)的應(yīng)用環(huán)境為 生產(chǎn)環(huán)境 prod!其讀取的信息,將會(huì)以生產(chǎn)環(huán)境的配置覆蓋掉默認(rèn)的環(huán)境配置!

此時(shí)再次發(fā)起請(qǐng)求:http://localhost:8081/technology/order/info/3  可以得到跟前面請(qǐng)求時(shí)不一樣的響應(yīng)結(jié)果,如下圖所示:



補(bǔ)充:

1、本文涉及到的相關(guān)的源代碼可以到此地址,check出來(lái)進(jìn)行查看學(xué)習(xí):

https://gitee.com/steadyjack/SpringBootTechnology

2、目前Debug已將本文所涉及的內(nèi)容整理錄制成視頻教程,感興趣的小伙伴可以前往觀看學(xué)習(xí):

https://www.fightjava.com/web/index/course/detail/5

3、關(guān)注一下Debug的技術(shù)微信公眾號(hào),最新的技術(shù)文章、技術(shù)課程以及技術(shù)專欄將會(huì)第一時(shí)間在公眾號(hào)發(fā)布哦!