欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot中項(xiàng)目的屬性配置的詳細(xì)介紹

 更新時(shí)間:2022年01月23日 10:34:54   作者:武哥聊編程  
很多時(shí)候需要用到一些配置的信息,這些信息可能在測(cè)試環(huán)境和生產(chǎn)環(huán)境下會(huì)有不同的配置,本文主要介紹了Springboot中項(xiàng)目的屬性配置的詳細(xì)介紹,感興趣的可以了解一下

正文

我們知道,在項(xiàng)目中,很多時(shí)候需要用到一些配置的信息,這些信息可能在測(cè)試環(huán)境和生產(chǎn)環(huán)境下會(huì)有不同的配置,后面根據(jù)實(shí)際業(yè)務(wù)情況有可能還會(huì)做修改,針對(duì)這種情況,我們不能將這些配置在代碼中寫死,最好就是寫到配置文件中。比如可以把這些信息寫到 application.yml 文件中。

1. 少量配置信息的情形

舉個(gè)例子,在微服務(wù)架構(gòu)中,最常見(jiàn)的就是某個(gè)服務(wù)需要調(diào)用其他服務(wù)來(lái)獲取其提供的相關(guān)信息,那么在該服務(wù)的配置文件中需要配置被調(diào)用的服務(wù)地址,比如在當(dāng)前服務(wù)里,我們需要調(diào)用訂單微服務(wù)獲取訂單相關(guān)的信息,假設(shè) 訂單服務(wù)的端口號(hào)是 8002,那我們可以做如下配置:

server:
? port: 8001

# 配置微服務(wù)的地址
url:
? # 訂單微服務(wù)的地址
? orderUrl: http://localhost:8002

然后在業(yè)務(wù)代碼中如何獲取到這個(gè)配置的訂單服務(wù)地址呢?我們可以使用 @Value 注解來(lái)解決。在對(duì)應(yīng)的類中加上一個(gè)屬性,在屬性上使用 @Value 注解即可獲取到配置文件中的配置信息,如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class ConfigController {

? ? private static final Logger LOGGER = LoggerFactory.getLogger(ConfigController.class);

? ? @Value("${url.orderUrl}")
? ? private String orderUrl;
? ??
? ? @RequestMapping("/config")
? ? public String testConfig() {
? ? ? ? LOGGER.info("=====獲取的訂單服務(wù)地址為:{}", orderUrl);
? ? ? ? return "success";
? ? }
}

@Value 注解上通過(guò) ${key} 即可獲取配置文件中和 key 對(duì)應(yīng)的 value 值。我們啟動(dòng)一下項(xiàng)目,在瀏覽器中輸入 localhost:8080/test/config 請(qǐng)求服務(wù)后,可以看到控制臺(tái)會(huì)打印出訂單服務(wù)的地址:

=====獲取的訂單服務(wù)地址為:http://localhost:8002

說(shuō)明我們成功獲取到了配置文件中的訂單微服務(wù)地址,在實(shí)際項(xiàng)目中也是這么用的,后面如果因?yàn)榉?wù)器部署的原因,需要修改某個(gè)服務(wù)的地址,那么只要在配置文件中修改即可。

2. 多個(gè)配置信息的情形

這里再引申一個(gè)問(wèn)題,隨著業(yè)務(wù)復(fù)雜度的增加,一個(gè)項(xiàng)目中可能會(huì)有越來(lái)越多的微服務(wù),某個(gè)模塊可能需要調(diào)用多個(gè)微服務(wù)獲取不同的信息,那么就需要在配置文件中配置多個(gè)微服務(wù)的地址。可是,在需要調(diào)用這些微服務(wù)的代碼中,如果這樣一個(gè)個(gè)去使用 @Value 注解引入相應(yīng)的微服務(wù)地址的話,太過(guò)于繁瑣,也不科學(xué)。

所以,在實(shí)際項(xiàng)目中,業(yè)務(wù)繁瑣,邏輯復(fù)雜的情況下,需要考慮封裝一個(gè)或多個(gè)配置類。舉個(gè)例子:假如在當(dāng)前服務(wù)中,某個(gè)業(yè)務(wù)需要同時(shí)調(diào)用訂單微服務(wù)、用戶微服務(wù)和購(gòu)物車微服務(wù),分別獲取訂單、用戶和購(gòu)物車相關(guān)信息,然后對(duì)這些信息做一定的邏輯處理。那么在配置文件中,我們需要將這些微服務(wù)的地址都配置好:

# 配置多個(gè)微服務(wù)的地址
url:
? # 訂單微服務(wù)的地址
? orderUrl: http://localhost:8002
? # 用戶微服務(wù)的地址
? userUrl: http://localhost:8003
? # 購(gòu)物車微服務(wù)的地址
? shoppingUrl: http://localhost:8004

也許實(shí)際業(yè)務(wù)中,遠(yuǎn)遠(yuǎn)不止這三個(gè)微服務(wù),甚至十幾個(gè)都有可能。對(duì)于這種情況,我們可以先定義一個(gè) MicroServiceUrl 類來(lái)專門保存微服務(wù)的 url,如下:

@Component
@ConfigurationProperties(prefix = "url")
public class MicroServiceUrl {

? ? private String orderUrl;
? ? private String userUrl;
? ? private String shoppingUrl;
? ? // 省去get和set方法
}

細(xì)心的朋友應(yīng)該可以看到,使用 @ConfigurationProperties 注解并且使用 prefix 來(lái)指定一個(gè)前綴,然后該類中的屬性名就是配置中去掉前綴后的名字,一一對(duì)應(yīng)即可。即:前綴名 + 屬性名就是配置文件中定義的 key。同時(shí),該類上面需要加上 @Component 注解,把該類作為組件放到Spring容器中,讓 Spring 去管理,我們使用的時(shí)候直接注入即可。

需要注意的是,使用 @ConfigurationProperties 注解需要導(dǎo)入它的依賴:

<dependency>
?? ?<groupId>org.springframework.boot</groupId>
?? ?<artifactId>spring-boot-configuration-processor</artifactId>
?? ?<optional>true</optional>
</dependency>

OK,到此為止,我們將配置寫好了,接下來(lái)寫個(gè) Controller 來(lái)測(cè)試一下。此時(shí),不需要在代碼中一個(gè)個(gè)引入這些微服務(wù)的 url 了,直接通過(guò) @Resource 注解將剛剛寫好配置類注入進(jìn)來(lái)即可使用了,非常方便。如下:

@RestController
@RequestMapping("/test")
public class TestController {

? ? private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);

? ? @Resource
? ? private MicroServiceUrl microServiceUrl;
? ??
? ? @RequestMapping("/config")
? ? public String testConfig() {
? ? ? ? LOGGER.info("=====獲取的訂單服務(wù)地址為:{}", microServiceUrl.getOrderUrl());
? ? ? ? LOGGER.info("=====獲取的用戶服務(wù)地址為:{}", microServiceUrl.getUserUrl());
? ? ? ? LOGGER.info("=====獲取的購(gòu)物車服務(wù)地址為:{}", microServiceUrl.getShoppingUrl());

? ? ? ? return "success";
? ? }
}

再次啟動(dòng)項(xiàng)目,請(qǐng)求一下可以看到,控制臺(tái)打印出如下信息,說(shuō)明配置文件生效,同時(shí)正確獲取配置文件內(nèi)容:

=====獲取的訂單服務(wù)地址為:http://localhost:8002
=====獲取的訂單服務(wù)地址為:http://localhost:8002
=====獲取的用戶服務(wù)地址為:http://localhost:8003
=====獲取的購(gòu)物車服務(wù)地址為:http://localhost:8004

3. 指定項(xiàng)目配置文件

我們知道,在實(shí)際項(xiàng)目中,一般有兩個(gè)環(huán)境:開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境。開(kāi)發(fā)環(huán)境中的配置和生產(chǎn)環(huán)境中的配置往往不同,比如:環(huán)境、端口、數(shù)據(jù)庫(kù)、相關(guān)地址等等。我們不可能在開(kāi)發(fā)環(huán)境調(diào)試好之后,部署到生產(chǎn)環(huán)境后,又要將配置信息全部修改成生產(chǎn)環(huán)境上的配置,這樣太麻煩,也不科學(xué)。

最好的解決方法就是開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境都有一套對(duì)用的配置信息,然后當(dāng)我們?cè)陂_(kāi)發(fā)時(shí),指定讀取開(kāi)發(fā)環(huán)境的配置,當(dāng)我們將項(xiàng)目部署到服務(wù)器上之后,再指定去讀取生產(chǎn)環(huán)境的配置。

我們新建兩個(gè)配置文件: application-dev.yml 和 application-pro.yml,分別用來(lái)對(duì)開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境進(jìn)行相關(guān)配置。這里為了方便,我們分別設(shè)置兩個(gè)訪問(wèn)端口號(hào),開(kāi)發(fā)環(huán)境用 8001,生產(chǎn)環(huán)境用 8002.

# 開(kāi)發(fā)環(huán)境配置文件
server:
? port: 8001
# 開(kāi)發(fā)環(huán)境配置文件
server:
? port: 8002

然后在 application.yml 文件中指定讀取哪個(gè)配置文件即可。比如我們?cè)陂_(kāi)發(fā)環(huán)境下,指定讀取 applicationn-dev.yml 文件,如下:

spring:
? profiles:
? ? active:
? ? - dev

這樣就可以在開(kāi)發(fā)的時(shí)候,指定讀取 application-dev.yml 文件,訪問(wèn)的時(shí)候使用 8001 端口,部署到服務(wù)器后,只需要將 application.yml 中指定的文件改成 application-pro.yml 即可,然后使用 8002 端口訪問(wèn),非常方便。

4. 總結(jié)

本節(jié)主要講解了 Spring Boot 中如何在業(yè)務(wù)代碼中讀取相關(guān)配置,包括單一配置和多個(gè)配置項(xiàng),在微服務(wù)中,這種情況非常常見(jiàn),往往會(huì)有很多其他微服務(wù)需要調(diào)用,所以封裝一個(gè)配置類來(lái)接收這些配置是個(gè)很好的處理方式。除此之外,例如數(shù)據(jù)庫(kù)相關(guān)的連接參數(shù)等等,也可以放到一個(gè)配置類中,其他遇到類似的場(chǎng)景,都可以這么處理。最后介紹了開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境配置的快速切換方式,省去了項(xiàng)目部署時(shí),諸多配置信息的修改。

到此這篇關(guān)于Springboot中項(xiàng)目的屬性配置的詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Springboot 項(xiàng)目屬性配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?Selenide?簡(jiǎn)介與用法

    Java?Selenide?簡(jiǎn)介與用法

    Selenium?是目前用的最廣泛的Web?UI?自動(dòng)化測(cè)試框架,本文給大家介紹下Java?Selenide使用,感興趣的朋友一起看看吧
    2022-01-01
  • springBoot啟動(dòng)輸出三行日志控制臺(tái)自動(dòng)停止操作

    springBoot啟動(dòng)輸出三行日志控制臺(tái)自動(dòng)停止操作

    這篇文章主要介紹了springBoot啟動(dòng)輸出三行日志控制臺(tái)自動(dòng)停止操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java基礎(chǔ)教程之封裝與接口

    Java基礎(chǔ)教程之封裝與接口

    這篇文章主要介紹了Java基礎(chǔ)教程之封裝與接口,本文用淺顯易懂的語(yǔ)言講解了Java中的封裝與接口,很形象的說(shuō)明了這兩個(gè)面向?qū)ο笮g(shù)語(yǔ),需要的朋友可以參考下
    2014-08-08
  • Java實(shí)現(xiàn)圖片拼接

    Java實(shí)現(xiàn)圖片拼接

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片拼接的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Mybatis中特殊SQL的執(zhí)行的實(shí)現(xiàn)示例

    Mybatis中特殊SQL的執(zhí)行的實(shí)現(xiàn)示例

    本文主要介紹了Mybatis中特殊SQL的執(zhí)行的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 基于SpringCloud手寫一個(gè)簡(jiǎn)易版Sentinel

    基于SpringCloud手寫一個(gè)簡(jiǎn)易版Sentinel

    SpringCloud Alibaba Sentinel是當(dāng)前最為流行一種熔斷降級(jí)框架,簡(jiǎn)單易用的方式可以快速幫助我們實(shí)現(xiàn)服務(wù)的限流和降級(jí),保證服務(wù)的穩(wěn)定性。
    2021-05-05
  • Spring Security如何在Servlet中執(zhí)行

    Spring Security如何在Servlet中執(zhí)行

    這篇文章主要介紹了Spring Security如何在Servlet中執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解Java的call by value和call by reference

    詳解Java的call by value和call by reference

    在本篇文章里小編給大家總結(jié)了關(guān)于Java的call by value和call by reference的相關(guān)用法和知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • 詳解Spring Boot 配置多個(gè)RabbitMQ

    詳解Spring Boot 配置多個(gè)RabbitMQ

    本篇文章主要介紹了Spring Boot 配置多個(gè)RabbitMQ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 多線程死鎖的產(chǎn)生以及如何避免死鎖方法(詳解)

    多線程死鎖的產(chǎn)生以及如何避免死鎖方法(詳解)

    下面小編就為大家?guī)?lái)一篇多線程死鎖的產(chǎn)生以及如何避免死鎖方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04

最新評(píng)論