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