阅读本章,建议先阅读Spring Ioc 环境与配置。Spring Ioc 环境与配置中讲解了@Value绑定配置数据到java对象的方法。
使用@ConfigurationProperties进行绑定 结合@Configuration绑定import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties("my.prop")
public class MyProperties {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我们可以通过@ConfigurationProperties注解在绑定application.properties配置文件中的配置项。如示例中我们的MyProperties对象中的name属性将绑定配置文件中的my.prop.name属性,如果my.prop.name = 中国。那么MyProperties Bean的name属性的值即为“中国”。
我们的示例中还结合了@Configuration注解,表示该Bean可以通过Spring扫描到容器,然后通过Ioc注入到我们要使用的类中。
@Value也是可以直接绑定到对应的bean的属性的,但我个人推荐使用@ConfigurationProperties的方式进行配置属性的绑定。
结合@Bean绑定注意别忘了getter/setter,当然你也可以使用lombok。
@Configuration
public class MyConfiguration {
@Bean
@ConfigurationProperties(prefix = "my.prop")
public MyProperties myProperties () {
return new MyProperties();
}
}
绑定List和Map类型
- 定义Bean对应的属性字段
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
import java.util.Map;
@Configuration
@ConfigurationProperties("my.prop")
public class MyProperties {
private String name;
private List colors;
private Map map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getColors() {
return colors;
}
public void setColors(List colors) {
this.colors = colors;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
}
- 配置list属性
my.prop.colors=red,bule,yellow,green # 或者 my.prop.colors[0]=red my.prop.colors[1]= bule
- 配置map属性
my.prop.map.k1 = 值1 my.prop.map./k2 = 值2 my.prop.map.[/k3] = 值3
绑定后的值为:{k1=值1, k2=值2, /k3=值3},注意:第三个值的key值为"/k3"而不是k3
如果键没有被[ ]中括号包围,则任何非字母数字字符都将被删除。
- 配置随机属性
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number-less-than-ten=${random.int(10)}
my.number-in-range=${random.int[1024,65536]}
@ConfigurationProperties方式绑定设置默认值
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties("my.prop")
public class MyProperties {
private String name = "中国";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
自定义配置提示信息
使用@ConfigurationProperties方式绑定不仅可以设置默认值,还可以结合spring-boot-configuration-processor来实现我们自定义的配置在编译后可以在我们编辑配置文件时进行提示
- 引入spring-boot-configuration-processor
org.springframework.boot spring-boot-configuration-processor true
- 在Bean对应的字段上添加文档注释
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties("my.prop")
public class MyProperties {
private String name = "中国";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 编译后编辑properties文件
绑定规则注意:一定要编译后才会有效果
我们通过如下官网示例来理解绑定的匹配原则
@ConfigurationProperties(prefix = "my.main-project.person")
public class MyPersonProperties {
private String firstName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
以上的代码与如下的配置属性都可以匹配
| 属性 | 匹配规则 |
|---|---|
| my.main-project.person.first-name | .properties和.yml文件都支持 |
| my.main-project.person.firstName | 标准的驼峰式语法。 |
| my.main-project.person.first_name | 下划线表示法,这是在.properties和.yml文件中使用的替代格式。 |
| MY_MAINPROJECT_PERSON_FIRSTNAME | 大写格式,在使用系统环境变量时推荐使用。 |
我们在配置对应的Bean上添加@Validated注解,即可使用Valid验证来验证配置属性。
@ConfigurationProperties("my.service")
@Validated
public class MyProperties {
@NotNull
private InetAddress remoteAddress;
// getters/setters...
}
关于参数验证请查看Spring MVC参数验证1以及相关章节。
上一篇:Spring Boot 配置
下一篇:待续



