<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 中的項目屬性配置詳解

          共 4241字,需瀏覽 9分鐘

           ·

          2021-02-05 09:51

          本來已收錄到我寫的10萬字Springboot經(jīng)典學(xué)習(xí)筆記中,筆記在持續(xù)更新……文末有領(lǐng)取方式

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

          1. 少量配置信息的情形

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

          server:
          ??port:?8001

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

          然后在業(yè)務(wù)代碼中如何獲取到這個配置的訂單服務(wù)地址呢?我們可以使用 @Value 注解來解決。在對應(yīng)的類中加上一個屬性,在屬性上使用 @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 注解上通過 ${key} 即可獲取配置文件中和 key 對應(yīng)的 value 值。我們啟動一下項目,在瀏覽器中輸入 localhost:8080/test/config 請求服務(wù)后,可以看到控制臺會打印出訂單服務(wù)的地址:

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

          說明我們成功獲取到了配置文件中的訂單微服務(wù)地址,在實際項目中也是這么用的,后面如果因為服務(wù)器部署的原因,需要修改某個服務(wù)的地址,那么只要在配置文件中修改即可。

          2. 多個配置信息的情形

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

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

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

          也許實際業(yè)務(wù)中,遠(yuǎn)遠(yuǎn)不止這三個微服務(wù),甚至十幾個都有可能。對于這種情況,我們可以先定義一個 MicroServiceUrl 類來專門保存微服務(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 來指定一個前綴,然后該類中的屬性名就是配置中去掉前綴后的名字,一一對應(yīng)即可。即:前綴名 + 屬性名就是配置文件中定義的 key。同時,該類上面需要加上 @Component 注解,把該類作為組件放到Spring容器中,讓 Spring 去管理,我們使用的時候直接注入即可。

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

          <dependency>
          ?<groupId>org.springframework.bootgroupId>
          ?<artifactId>spring-boot-configuration-processorartifactId>
          ?<optional>trueoptional>
          dependency>

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

          @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("=====獲取的購物車服務(wù)地址為:{}",?microServiceUrl.getShoppingUrl());

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

          再次啟動項目,請求一下可以看到,控制臺打印出如下信息,說明配置文件生效,同時正確獲取配置文件內(nèi)容:

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

          3. 指定項目配置文件

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

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

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

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

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

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

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

          4. 總結(jié)

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

          該文已收錄到我寫的《10萬字Springboot經(jīng)典學(xué)習(xí)筆記》中,歡迎掃描下方二維碼領(lǐng)取全套筆記



          關(guān)注武哥聊編程

          回復(fù):筆記



          點贊是最大的支持?

          瀏覽 25
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆精品无码 | 国产一区二区三区熟女免费 | 男女系列视频福利网站 | 一级黄色特级片 | 国产在线黄色电影 |