Spring Boot可使用注解的方式将自定义的properties文件映射到实体bean中,比如application.properties文件 或者application.yml。
ConfigurationProperties是一个注解,可以标注在一个Class上,这样Spring Boot会从Environment中获取其属性对应的属性值给其进行注入。
@Component
@ConfigurationProperties(prefix = "student")
@PropertySource(value = "classpath:application.properties",encoding = "UTF-8")
@Getter
@Setter
@ToString
public class Student {
private String email ;
private String name;
@Value("${student.uname}")
private String userName;
@Value("25")
private int age ;
private boolean sex ; //true:男 false:女
private Date birthday ;
private Map location ;
private String[] hobbies ;
private List skills ;
private Pet pet;
}
public class Pet {
private String nickName ;//松散写法nick-name
private String strain ;
}
#通过配置文件修改默认端口(8080)
server.port=8081
#通过配置文件注入对象属性:字符串,数值,日期,list,map,数组,成员对象
student.uname=风雨
student.name=风雨2
student.age=25
student.sex=true
student.birthday=2019/07/24
student.location.province="深圳2
student.location.city='南\n山'
student.location.zone=南\n山
student.hobbies=足球2,篮球f
student.skills=[编程,xue学习]
[email protected]
student.pet.nickName= wc555
student.pet.strain=strahsq
server:
port: 8883
#spring:
# profiles:
# active: dev
---
server:
port: 8884
spring:
profiles: dev
---
server:
port: 8885
spring:
profiles: test
student:
uname: x
name: ${student.user.name2:无名}
#age: 23
sex: true
birthday: 2019/02/12
location: {province: "陕222西",city: '西\n安',zone: 莲湖\n区}
#province: 陕西1
#city: 西安1
#zone: 莲湖区1
#行内写法
hobbies: 足球2,篮球22 # 行内写法
# - 足球
# - 篮球
skills:
编程333,金融33 # 行内写法
# - 编程
# - 金融
pet: {nick-name: wc555,strain: hsq}
email: [email protected]
#nickName: wc
#strain: hsq
application.properties : k=v,或行内写法(k: v,[Set/List/数组] {map,对象类型的属性},并且 []可省,{}不能省)
application.yml : yaml ain't myarkup language ,不是一个标记文档
1. k:空格v 2.通过垂直对齐 指定层次关系
3.默认可以不写引号; ""会将其中的转义符进行转义,其他不会
@PropertySource:默认会加载application.properties/application.yml文件中的数据;
例如@PropertySource(value={"classpath:conf.properties"})加载conf.properties文件中的数据;
但是,@PropertySource只能加载properties,不能加载yml
--------------------------------------------------------------------------------------------------------------------------
注意@ConfigurationProperties并没有把当前类注册成为一个Spring的Bean。
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
.....
@ConfigurationProperties(prefix = "doc")
public class DocumentServerProperties {
//代码...
}
@EnableConfigurationProperties
@Configuration
public class SomeConfiguration {
private DocumentServerProperties documentServerProperties
public SomeConfiguration(DocumentServerProperties documentServerProperties) {
this.documentServerProperties = documentServerProperties;
}
}
@Configuration
public class SomeConfiguration {
@Bean
public DocumentServerProperties documentServerProperties(){
return new DocumentServerProperties();}
@ConfigurationProperties("demo.third")
@Bean
public ThirdComponent thirdComponent(){
return new ThirdComponent();
}
}
--------------------------------------------------------------------------------------------------------------------------
ConfigurationProperties | @Value | |
注值 | 批量注入 | 单个 |
松散语法 | 支持 | 不支持 |
SpEL(Spring表达式语言) | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
注入复杂类型 | 支持 | 不支持 |
说明:
松散语法 既可以用双引号,也可以用单引号 引号可以省略。
SpEL(Spring表达式语言)
JSR303数据校验 ,利用JSR303规范的实现对DocumentServerProperties属性配置类,添加一些常规验证,比如Null检查、数字校验等操作,
@ConfigurationProperties(prefix = "doc")
@Validated
public class DocumentServerProperties {
@NotNull // 判断不为空的情况
private String remoteAddress;
//限制端口只能是80-65536之间
@Min(80)
@Max(65536)
private int port;
//其他代码
}
:在有些数情况下,我们希望自定义验证器,有两种方式可以进行实现,在此不展开。
ref
阿里云云栖社区 Spring Boot(07)——ConfigurationProperties介绍
segmentfault Spring Boot 2.0 @ConfigurationProperties 使用