我们知道,在项目中,很多时候需要用到一些配置的东西,这些东西可能在测试环境和生产环境下会有不同的配置,后面也有可能会做修改,所以我们不能在代码中写死,要写到配置中。我们可以把这些内容写到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