本章内容
- 在SpringBoot中读取文件的几种方式
- @Value注解读取方式
- @ConfigurationProperties注解读取方式
- @ PropertySource + @ Value注解读取方式
- @ PropertySource + @ ConfigurationProperties注解读取方式
- 实际项目中对待少量配置和大量配置时不同的处理方式方法
- 指定指定的项目配置文件
一、SpringBoot中读取配置文件属性的方式
我们知道,在项目中,很多时候需要用到一些配置的信息,这些信息可能在测试环境和生产环境下会有不同的配置,后面根据实际业务情况有可能还会做修改,针对这种情况,我们不能将这些配置在代码中写死,最好就是写到配置文件中。比如可以把这些信息写到 application.properties或者
application.yml文件中。
1.1 @Value注解读取方式
第一步:在application.properties中添加属性
info.address =美国
info.company =春季
info.degree =高
第二步:在项目中读取属性
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class InfoConfig1{
@Value("${info.address}")
private String address;
@Value("${info.company}")
private String company;
@Value("${info.degree}")
private String degree;
//此处省略getter和setter方法
}
1.2 @ConfigurationProperties注解读取方式
@Component
@ConfigurationProperties(prefix = "info")
public class InfoConfig2 {
private String address;
private String company;
private String degree;
// 省去get和set方法
}
1.3 读取指定文件
资源目录下建立config / db-config.properties:
db.username = root
db.password = 123456
1.3.1 @ PropertySource + @ Value注解读取方式
@Component
@PropertySource(value ={"config/db-config.properties"})
public class DBconfig1{
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
//省略getter和setter方法
}
注意:@PropertySource不支持yml文件读取。
1.3.2 @ PropertySource + @ ConfigurationProperties注解读取方式
@Component
@ConfigurationProperties(prefix ="db")
@PropertySource(value ={"config/db-config.properties"})
public class Config2{
private String username;
private String password;
//省略getter和setter方法
}
二、项目中实际采用的方式
2.1 少量配置信息的情形
举个例子,在微服务架构中,最常见的就是某个服务需要调用其他服务来获取其提供的相关信息,那么在该服务的配置文件中需要配置被调用的服务地址,比如在当前服务里,我们需要调用订单微服务获取订单相关的信息,假设 订单服务的端口号是 8002,那我们可以做如下配置:
server:
port: 8001# 配置微服务的地址
url:
# 订单微服务的地址
orderUrl: http://localhost:8002
然后在业务代码中如何获取到这个配置的订单服务地址呢?我们可以使用 @Value
注解来解决。在对应的类中加上一个属性,在属性上使用 @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("=====获取的订单服务地址为:{}", orderUrl);
return "success";
}
}
@Value
注解上通过 ${key}
即可获取配置文件中和 key 对应的 value 值。
2.2 多个配置信息的情形
在实际项目中,业务繁琐,逻辑复杂的情况下,需要考虑封装一个或多个配置类。举个例子:假如在当前服务中,某个业务需要同时调用订单微服务、用户微服务和购物车微服务,分别获取订单、用户和购物车相关信息,然后对这些信息做一定的逻辑处理。那么在配置文件中,我们需要将这些微服务的地址都配置好:
# 配置多个微服务的地址
url:
# 订单微服务的地址
orderUrl: http://localhost:8002
# 用户微服务的地址
userUrl: http://localhost:8003
# 购物车微服务的地址
shoppingUrl: http://localhost:8004
也许实际业务中,远远不止这三个微服务,甚至十几个都有可能。对于这种情况,我们可以先定义一个 MicroServiceUrl
类来专门保存微服务的 url,如下:
@Component
@ConfigurationProperties(prefix = "url")
public class MicroServiceUrl {
private String orderUrl;
private String userUrl;
private String shoppingUrl;
// 省去get和set方法
}
使用 @ConfigurationProperties
注解并且使用 prefix 来指定一个前缀,然后该类中的属性名就是配置中去掉前缀后的名字,一一对应即可。即:前缀名 + 属性名就是配置文件中定义的 key。同时,该类上面需要加上 @Component
注解,把该类作为组件放到Spring容器中,让 Spring 去管理,我们使用的时候直接注入即可。
使用 @ConfigurationProperties
注解需要导入它的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
写个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";
}
}
2.3 指定项目配置文件
在实际项目中,一般有两个环境:开发环境和生产环境。开发环境中的配置和生产环境中的配置往往不同,比如:环境、端口、数据库、相关地址等等。 我们不可能在开发环境调试好之后,部署到生产环境后,又要将配置信息全部修改成生产环境上的配置,这样太麻烦,也不科学。
最好的解决方法就是开发环境和生产环境都有一套对用的配置信息,然后当我们在开发时,指定读取开发环境的配置,当我们将项目部署到服务器上之后,再指定去读取生产环境的配置。
我们新建两个配置文件: application-dev.yml
和 application-pro.yml
,分别用来对开发环境和生产环境进行相关配置。这里为了方便,我们分别设置两个访问端口号,开发环境用 8001,生产环境用 8002.
# 开发环境配置文件
server:
port: 8001# 开发环境配置文件
server:
port: 8002
然后在 application.yml
文件中指定读取哪个配置文件即可。比如我们在开发环境下,指定读取 applicationn-dev.yml
文件,如下:
spring:
profiles:
active:
- dev
这样就可以在开发的时候,指定读取 application-dev.yml
文件,访问的时候使用 8001 端口,部署到服务器后,只需要将 application.yml
中指定的文件改成 application-pro.yml
即可,然后使用 8002 端口访问,非常方便。