該註解的做用相似於@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 [不是一個合法的電子郵件地址]