我們知道,在項目中,很多時候需要用到一些配置的東西,這些東西可能在測試環境和生產環境下會有不同的配置,后面也有可能會做修改,所以我們不能在代碼中寫死,要寫到配置中。我們可以把這些內容寫到application.yml文件中。

舉個例子,在微服務架構中,某個服務經常會調用其他服務來獲取相關信息,那么需要配置其他服務的地址,我們可以做如下配置:

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

然后在代碼中如何獲取到這些配置內容呢?我們在屬性上使用@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?TestController?{private?static?final?Logger?LOGGER?=?LoggerFactory.getLogger(TestController.class);@Value("${url.orderUrl}")private?String?orderUrl;@Value("${url.userUrl}")private?String?userUrl;@Value("${url.shoppingUrl}")private?String?shoppingUrl;@RequestMapping("/config")public?String?testConfig()?{LOGGER.info("=====獲取的訂單服務地址為:{}",?orderUrl);LOGGER.info("=====獲取的用戶服務地址為:{}",?userUrl);LOGGER.info("=====獲取的購物車服務地址為:{}",?shoppingUrl);return?"success";}
}

很簡單,請求一下該8001端口的服務后,可以看到控制臺會打印出三個服務的地址,在實際項目中也是這么用的,后面如果因為服務器部署的原因,需要修改某個服務的地址,那么只要在配置文件中修改即可。

這里再引申一個問題,隨著業務復雜度的增加,一個項目中可能會有越來越多的微服務,那么代碼中,如果這樣一個個去使用@Value注解引入的話,太繁瑣,也不科學。所以可以考慮封裝一個配置類。

/***?@author?shengwu?ni*?@date?2018/06/11*/
@Component
@ConfigurationProperties(prefix?=?"url")
public?class?MicroServiceUrl?{private?String?orderUrl;private?String?userUrl;private?String?shoppingUrl;//?省去get和set方法
}

使用@ConfigurationProperties注解可以指定一個前綴,然后該類中的屬性名就是配置中去掉前綴后的名字,一一對應即可。同時,該類上面需要加上@Component注解,作為組件放到Spring容器中。對了,使用@ConfigurationProperties需要導入一個依賴:

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


OK,再寫個Controller來測試一下,此時,不需要再一個個引入了,直接通過@Resource注解將剛剛的配置類注入進來即可使用了,非常方便。如下:

@RestController
@RequestMapping("/test")
public?class?TestController?{private?static?final?Logger?LOGGER?=?LoggerFactory.getLogger(TestController.class);@Resourceprivate?MicroServiceUrl?microServiceUrl;@RequestMapping("/config")public?String?testConfig()?{LOGGER.info("=====獲取的訂單服務地址為:{}",?microServiceUrl.getOrderUrl());LOGGER.info("=====獲取的用戶服務地址為:{}",?microServiceUrl.getUserUrl());LOGGER.info("=====獲取的購物車服務地址為:{}",?microServiceUrl.getShoppingUrl());return?"success";}
}


關注小編

可獲得兩大新人禮包

36份一線互聯網Java面試電子書

84個Java稀缺面試題視頻

地址:http://yunxi.ai/java/java.html