基本使用
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "db.mysql.stock")
public class DBConfig {
private String url;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "DBConfig{" +
"url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
db.mysql.stock.url = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
db.mysql.stock.username = tim
db.mysql.stock.password = 123456
@ConfigurationProperties使用非常简单,就是自动为属性注入配置值。
@ConfigurationProperties会加载路径中的所有属性文件,所以配置的时候要注意是否会有覆盖问题。
更通用的方式是与@Configuration使用在配置类上:
@Configuration
@ConfigurationProperties(prefix = "db.mysql.stock")
public class DBConfig {
}
绑定规则
hostName = 127.0.0.1
hostname = 127.0.0.1
host_name = 127.0.0.1
host-name = 127.0.0.1
HOST_NAME = 127.0.0.1
@ConfigurationProperties做了很多兼容处理,所以上面的这些都能绑定到hostName这个名称的字段上,不过我们还是应该尽量统一规范。
ignoreInvalidFields
绑定属性的时候遇到非法字段怎么处理?
比如一个一个Integer类型的字段,配置的却是Hello,将会怎么样?
默认是抛出异常,可以设置ignoreInvalidFields为true
@ConfigurationProperties(prefix = “db.mysql.stock”,ignoreInvalidFields = true)
ignoreUnknownFields
如果有未知属性怎么办?
默认是忽略这个属性,有些时候比较特殊的属性是不能随便忽略的,就需要将ignoreUnknownFields设置为false
@ConfigurationProperties(prefix = “db.mysql.stock”,ignoreUnknownFields = false)
绑定列表
如果字段是个list怎么绑定?
private List servers;
tool.servers[0]= 192.168.10.5
tool.servers[1]= 192.168.10.6
绑定map
tool.config[k1] = v1
tool.config[k2] = v2
tool.config[k3] = v3
tool.user[k1].name = tim
tool.user[k1].phone = 13777777777
原理
主要通过ConfigurationPropertiesBindingPostProcessor对Bean进行修改,ConfigurationPropertiesBindingPostProcessor,继承了BeanPostProcessor。
BeanPostProcessor可以在bean对象调用init-method方法的前后进行修改。
具体实现可以看ConfigurationPropertiesBinder。