我们知道,在项目中,很多时候需要用到一些配置的东西,这些东西可能在测试环境和生产环境下会有不同的配置,后面也有可能会做修改,所以我们不能在代码中写死,要写到配置中。我们可以把这些内容写到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); @Resource private MicroServiceUrl microServiceUrl; @RequestMapping("/config") public String testConfig() { LOGGER.info("=====获取的订单服务地址为:{}", microServiceUrl.getOrderUrl()); LOGGER.info("=====获取的用户服务地址为:{}", microServiceUrl.getUserUrl()); LOGGER.info("=====获取的购物车服务地址为:{}", microServiceUrl.getShoppingUrl()); return "success"; } }