前言
在平时的工作中,我们可能会需要从配置文件***.properties
或***.yml
中获取一些配置参数。那么,在Spring Boot项目中我们可以使用@Value
或者@ConfigurationProperties
注解来获取。接下来,让我们一起探索这两个注解的详细使用方法吧。
在接下来的内容中,我们可以学习到如何在配置文件中配置 Key : Value
、POJO
、List<String>
、List<POJO>
、Map<String, String>
和 Map<String, POJO>
结构,并在项目中使用 @Value
或 @ConfigurationProperties
获取这些配置。
正文
@Value 与 @ConfigurationProperties 的区别
从 spring-boot 官方文档中,我们可以看到这段内容:
大致内容就是:
使用
@Value("${property}")
注解注入配置属性有时会很麻烦,尤其是当您使用多个属性或您的数据本质上是分层的时候。Spring Boot 提供了一种替代方法:@ConfigurationProperties
,它让强类型 bean 管理和验证应用程序的配置项。
文档中还总结了@ConfigurationProperties vs @Value 各自支持的功能特性,如下图:
感兴趣的朋友可以点击上文中的链接去翻阅官方的详细文档,这里就不做过多介绍了。
言归正传,下面我们正式开始列举一些常用格式的配置项该如何使用@Value
或 @ConfigurationProperties
去获取。
1. 配置简单的 Key : Value 结构
#### properties 文件配置格式:
app.environments-config.dev-url=https://dev.example.com
#### YML 文件配置格式:
app:
environments-config:
dev-url: https://dev.example.com
@Value 获取配置
@Value("${app.environments-config.dev-url}")
private String devUrl;
@ConfigurationProperties 获取配置
@Data
@Component
@ConfigurationProperties("app.environments-config")
public class Config {
// 获取配置
private String devUrl;
}
2. 配置 List<String> 结构
2.1 List<String> - 逗号分隔方式
2.1.1 properties 文件配置格式:
2.1.2 YML 文件配置格式:
从上图中可以看出 @ConfigurationProperties
无需做任何操作就可以自动将以逗号
连接的配置项转换为集合;而 @Value
则需要使用 SpEL
表达式来实现。至于为什么 @ConfigurationProperties
可自动实现转换,可以查阅官方文档 Relaxed Binding 这部分内容。
2.2 List<String> - 数组方式 (仅限于@ConfigurationProperties)
2.2.1 properties 文件配置格式:
app.environments-config.dev-url[0]=https://dev.example.com
app.environments-config.dev-url[1]=https://dev222.example.com
2.2.2 YML 文件配置格式:
app:
environments-config:
dev-url:
- https://dev.example.com
- https://dev222.example.com
3. 配置 POJO 结构 (仅限于@ConfigurationProperties)
3.1 properties 文件格式
3.2 YML 文件格式:
4. 配置 List<POJO> 结构 (仅限于@ConfigurationProperties)
4.1 properties 文件格式
4.2 YML 文件格式
目录 4.1 及 4.2 中不论是 properties文件格式还是 YML文件格式,其中配置的 dev-users 都可使用以逗号分隔的方式来编写,会使配置文件显得更加简洁。
5. 配置 Map<String, String> 结构
5.1 @Value 对应的写法
#### properties文件配置格式:
app.environments-config={"dev-url":"https://dev.example.com", "qa-url":"https://qa.example.com"}
#### YML文件配置格式:
app:
environments-config: '{"dev-url":"https://dev.example.com", "qa-url":"https://qa.example.com"}'
// 获取配置
@Value("#{${app.environments-config}}")
private Map<String, String> value;
5.2 @ConfigurationProperties 对应的写法
#### properties文件配置格式
app.environments-config.dev-url=https://dev.example.com
app.environments-config.qa-url=https://qa.example.com
#### YML文件配置格式
app:
environments-config:
dev-url: https://dev.example.com
qa-url: https://qa.example.com
@Data
@Component
@ConfigurationProperties("app")
public class Config {
// 获取配置
private Map<String, String> environmentsConfig;
}
6. 配置 Map<String, POJO> 结构 (仅限于@ConfigurationProperties)
properties 文件配置方式:
#### 方式一:
app.environments-config.dev.url=https://dev.example.com
app.environments-config.dev.users=zhagnsan,lisi
app.environments-config.qa.url=https://qa.example.com
app.environments-config.qa.users=xiaobai,xiaohong
#### 方式二:
app.environments-config.dev.url=https://dev.example.com
app.environments-config.dev.users[0]=zhagnsan
app.environments-config.dev.users[1]=lisi
app.environments-config.qa.url=https://qa.example.com
app.environments-config.qa.users[0]=xiaobai
app.environments-config.qa.users[1]=xiaohong
YML 文件配置方式:
#### 方式一:
app:
environments-config:
dev:
url: https://dev.example.com
users: zhagnsan,lisi
qa:
url: https://qa.example.com
users: xiaobai,xiaohong
#### 方式二:
app:
environments-config:
dev:
url: https://dev.example.com
users:
- zhagnsan
- lisi
qa:
url: https://qa.example.com
users:
- xiaobai
- xiaohong
@ConfigurationProperties 获取配置
@Data
@Component
@ConfigurationProperties("app")
public class Config {
// 获取配置
private Map<String, EnvironmentsConfigBO> environmentsConfig;
@Data
public static class EnvironmentsConfigBO {
private String url;
private List<String> users;
}
}
结语:
通过上面文章的介绍,我们可以看出:在配置简单的 Key : Value 及 List<String> 结构时,可以使用 @Value
去获取会更加方便,其他结构如:POJO、List<POJO>、Map<String, String>、Map<String, POJO> 则使用 @ConfigurationProperties
去获取。
扩展阅读:
@Value设置默认值
// 冒号后面的内容即为默认值
@Value("${app.environments-config.dev-url:http://localhost}")
private String devUrl;
使用JSR303注解进行有效性校验
绑定属性值到第三方jar中包含的Class
如果需要绑定属性值到第三方jar中包含的Class对象,我们是无法直接在Class上加上@ConfigurationProperties
注解的,这时候可以在@Configuration
标注的Class中定义一个需要绑定值的Class类型的bean,然后在该方法上加上@ConfigurationProperties
。比如下面代码中通过initTestConfigurationProperties()定义了一个TestConfigurationProperties类型的bean,在该方法上加上了@ConfigurationProperties
,Spring Boot就会为该bean进行属性值绑定。
@Configuration
public class TestConfig {
@Bean
@ConfigurationProperties("test.config")
public TestConfigurationProperties initTestConfigurationProperties() {
return new TestConfigurationProperties();
}
}
网友评论