该注解的做用相似于@Value
,即为组件中的属性进行赋值。html
首先是创建一个springboot的工程,再也不赘述。java
首先咱们创建一个Person
类和一个Dog
类。spring
package com.helius.springboot.bean; @Component //加上它,即成为ioc容器中的一个组件 @ConfigurationProperties(prefix = "person") public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; // 省略了setter、getter、toString()等 }
再来看SpringBoot的主配置文件application.propertiesspringboot
person.last-name=张三 person.age=18 person.birth=2017/12/15 person.boss=false person.maps.k1=v1 person.maps.k2=14 person.lists=a,b,c person.dog.name=perter person.dog.age=15
在springboot的测试类中进行测试mvc
/** * SpringBoot单元测试; * * 能够在测试期间很方便的相似编码同样进行自动注入等容器的功能 * */ @RunWith(SpringRunner.class) @SpringBootTest public class SpringBoot02ConfigApplicationTests { @Autowired Person person; @Test public void contextLoads() { System.out.println(person); } }
控制台打印一下结果:app
Person{lastName='张三', age=18, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=14}, lists=[a, b, c], dog=Dog{name='perter', age=15}}
咱们发现,容器中person组件已经所有被赋值了。单元测试
由于咱们使用了@ConfigurationProperties(prefix = "person")
这个注解测试
将配置文件中配置的每个属性的值,映射到这个组件中编码
==@ConfigurationProperties:告诉SpringBoot将本类中的全部属性和配置文件中相关的配置进行绑定; prefix = "person":配置文件中哪一个下面的全部属性进行一一映射==spa
在以前的博文中:Spring中使用@Value和@PropertySource为属性赋值中介绍@Value注解,
它可以为组件注入外部配置文件中的值。
那在springboot中的,能够直接使用@Value注解,不须要导入主配置文件application.properties,毕竟它是主配置文件,也是放在springboot约定的位置的。
既然@Value和@ConfigurationProperties都能为组件赋值,那区别呢?
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散语法 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
person.last-name
也可以为Person类中的lastName属性进行赋值。其实你使用last-name仍是last_name亦或lastName都可以为Pseron中对应的属性赋值,这叫松散绑定
@Vavlue(${person.map})是拿不到值的。
改造一下Person类。
package com.helius.springboot.bean; @Component //加上它,即成为ioc容器中的一个组件 @ConfigurationProperties(prefix = "person") @Validated public class Person { @Email private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; // 省略了setter、getter、toString()等 }
这是在赋值的时候检查lastName必须是邮件格式,
从新运行测试方法
Field error in object 'person' on field 'lastName': rejected value [张三]; codes [Email.person.lastName,Email.lastName,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.lastName,lastName]; arguments []; default message [lastName],[Ljavax.validation.constraints.Pattern$Flag;@702ed190,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@173b9122]; default message [不是一个合法的电子邮件地址]