SpringBoot2.0@ConfigurationProperties使⽤详解
引⾔
Spring Boot的⼀个便捷功能是外部化配置,可以轻松访问属性⽂件中定义的属性。本⽂将详细介绍@ConfigurationProperties 的使⽤。
配置项⽬POM
在l中定义Spring-Boot 为parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
添加依赖
1. 添加web,因为我们需要使⽤到JSR-303规范的Validator,如果不想使⽤web依赖,也可以直接依赖hibernate-validator
2. 添加spring-boot-configuration-processor,可以在编译时⽣成属性元数据(spring-configuration-metadata.json).
3. 添加lombok,可以⽅便使⽤注释处理器的功能省去Pojo定义中get set这些⿇烦⼯作.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.hibernate.validator</groupId>-->
<!--<artifactId>hibernate-validator</artifactId>-->
<!--<version>6.0.11.Final</version>-->
<!--<scope>compile</scope>-->
<!--</dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
例⼦编写
⾸先定义⼀个DocumentServerProperties对象,下⾯这个⽂档服务器配置是我假设的,主要是为了演⽰属性配置的⼤部分情况
@Getter
@Setter
public class DocumentServerProperties {
private String remoteAddress;
private boolean preferIpAddress;
private int maxConnections=0;
private int port;
private AuthInfo authInfo;
private List<String> whitelist;
private Map<String,String> converter;
private List<Person> defaultShareUsers;
@Getter
@Setter
public static class AuthInfo {
private String username;
private String password;
}
}
绑定属性配置
注意@ConfigurationProperties并没有把当前类注册成为⼀个Spring的Bean,下⾯介绍@ConfigurationProperties配置注⼊的三种⽅式.
配合@Component注解直接进⾏注⼊
@ConfigurationProperties(prefix = "doc")
@Component
public class DocumentServerProperties {
//代码...
}
使⽤@EnableConfigurationProperties,通常配置在标有@Configuration的类上,当然其他@Component注解的派⽣类也可以,不过不推荐.
@ConfigurationProperties(prefix = "doc")
public class DocumentServerProperties {
//代码...
}
@EnableConfigurationProperties
@Configuration
public class SomeConfiguration {
private DocumentServerProperties documentServerProperties
public SomeConfiguration(DocumentServerProperties documentServerProperties) {
this.documentServerProperties = documentServerProperties;
}
}
使⽤@Bean⽅式在标有@Configuration的类进⾏注⼊,这种⽅式通常可以⽤在对第三⽅类进⾏配置属性注册
@Configuration
public class SomeConfiguration {
@Bean
public DocumentServerProperties documentServerProperties(){
return new DocumentServerProperties();
}
@ConfigurationProperties("demo.third")
@Bean
public ThirdComponent thirdComponent(){
return new ThirdComponent();
}
}
编写配置⽂件
Spring-Boot中配置⽂件的格式有properties和yaml两种格式,针对上⾯的配置对象分别写了两种格式的配置⽂件例⼦. Properties
<-address=127.0.0.1
doc.port=8080
doc.max-connections=30
doc.prefer-ip-address=true
#doc.whitelist=192.168.0.1,192.168.0.2
# 这种等同于下⾯的doc.whitelist[0] doc.whitelist[1]
doc.whitelist[0]=192.168.0.1
doc.whitelist[1]=192.168.0.2
doc.default-share-users[0].name=jack
doc.default-share-users[0].age=18
doc.auth-info.username=user
doc.auth-info.password=password
Yaml
doc:
remote-address: 127.0.0.1
max-connections: 30
prefer-ip-address: true
whitelist:
- 192.168.0.1
- 192.168.0.2
default-share-users:
- name: jack
age: 18
converter:
a: aConverter
b: bConverter
auth-info:
username: user
password: password
在上⾯的两个配置⽂件中,其实已经把我们平常⼤部分能使⽤到的属性配置场景都覆盖了,可能还有⼀些特殊的未介绍到,⽐如Duration、InetAddress等。
增加属性验证
下⾯我们利⽤JSR303规范的实现对DocumentServerProperties属性配置类,添加⼀些常规验证,⽐如Null检查、数字校验等操作,
需要注意在Spring-Boot 2.0版本以后,如果使⽤JSR303对属性配置进⾏验证必须添加@Validated注解,使⽤⽅式如下⽚段:
@ConfigurationProperties(prefix = "doc")
@Validated
public class DocumentServerProperties {spring怎么读取properties
@NotNull // 判断不为空的情况
private String remoteAddress;
//限制端⼝只能是80-65536之间
@Min(80)
@Max(65536)
private int port;
//其他代码
}
在有些数情况下,我们希望⾃定义验证器,有两种⽅式可以进⾏实现
实现org.springframework.validation.Validator接⼝,并且在配置⼀个Bean名称必须叫configurationPropertiesValidator,代码如下:
public class UserLoginValidator implements Validator {
private static final int MINIMUM_PASSWORD_LENGTH = 6;
public boolean supports(Class clazz) {
return UserLogin.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors) {
UserLogin login = (UserLogin) target;
if (Password() != null
&& Password().trim().length() < MINIMUM_PASSWORD_LENGTH) {
new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)},
"The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in );
}
}
}
和上⾯⼀样也是实现org.springframework.validation.Validator接⼝,不过是需要验证的属性配置类本⾝去实现这个接⼝
@ConfigurationProperties(prefix = "doc")
public class DocumentServerProperties implements Validator{
@NotNull
private String remoteAddress;
private boolean preferIpAddress;
//其他属性
public boolean supports(Class<?> clazz) {
return true;
}
@Override
public void validate(Object target, Errors errors) {
//判断逻辑其实可以参照上⾯的代码⽚段
}
}
特别注意:
只有在需要使⽤JSR303规范实现的验证器时,才需要对对象配置@Validated,刚刚上⾯两种⽅式并不需要。
第⼀种实现和第⼆种实现都是实现org.springframework.validation.Validator接⼝,但是前者是针对全局的,后者只针对实现这个接⼝的配置对象
关于上述两点,我为啥确定? 来⾃ConfigurationPropertiesBinder的源码⽚段
private List<Validator> getValidators(Bindable<?> target) {
List<Validator> validators = new ArrayList<>(3);
if (figurationPropertiesValidator != null) {
validators.figurationPropertiesValidator);
}
if (this.jsr303Present && Annotation(Validated.class) != null) {
validators.add(getJsr303Validator());
}
if (Value() != null && Value().get() instanceof Validator) {
validators.add((Validator) Value().get());
}
return validators;
}
总结
通过上⾯的例⼦,我们了解了@ConfigurationProperties的使⽤以及如何进⾏验证,包括属性验证器的⼏种实现⽅式.下个章节我会从源码的⾓度分析属性的加载,以及如何解析到Bean⾥⾯去的。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。