在实际工作中我们无法避免如何区分多环境的问题,开发环境连接的是开发环境的数据库,测试环境连接的是测试环境的数据库,等等,不同环境下的配置信息是不一样的。在使用SpringBoot时,我们可以为每个环境定义一个配置文件,将对应配置写在yaml或者properties中,最后通过 spring.profiles.active 来激活对应的配置文件。
我们往往会读取配置文件中的配置信息,除了Java提供的Properties类,还可以通过另外的三种方式在 Spring Boot 中读取配置内容:Environment,@Value,@ConfigurationProperties。
Environment
Environment 用于管理当前的应用环境信息,定义了获取 Profile 的方法,同时继承了 PropertyResolver,PropertyResolver 提供了属性访问的相关方法。所以我们通过 Environment 的 getProperty() 方法读取指定配置 Key 的内容。
通过注入Environment的实例,然后调用 getProperty() 方法获取对应的参数:
@RestController
public class TestApi {
@Autowired
private Environment environment;
@GetMapping("/test")
public void test() {
String port = environment.getProperty("server.port");
System.out.println(port);
}
}
@Value
在 Controller 中定义一个 port 字段,在 port 上使用 @Value 注入当前项目的端口值,冒号后面是在无值的情况下给的默认值,避免没配置值的报错问题。
@RestController
public class TestApi {
@Value("${server.port:8080}")
private String port;
@GetMapping("/test")
public void test() {
System.out.println(port);
}
}
@ConfigurationProperties
前两种方式都是针对某一个字段属性的,但是有时候我们要需要一系列相关属性(例如数据库的地址,端口,账号等),我们可以使用@ConfigurationProperties将这一系列的属性封装到某个类中。之后在使用时注入这个类就行。
/**
* 编写配置类
*/
@ConfigurationProperties(prefix = "server")
public class ConfigProperties {
private String port;
//省略get,set方法
}
@RestController
public class TestApi {
@Autowired
private ConfigProperties configProperties ;
@GetMapping("/test")
public void test() {
System.out.println(configProperties.getPort());
}
}