SpringBoot中的@ConfigurationProperties

有什麼用

該註解的做用相似於@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數據校驗 支持 不支持
複雜類型封裝 支持 不支持
  1. 鬆散語法:能夠發現配置文件中咱們使用person.last-name也可以爲Person類中的lastName屬性進行賦值。

其實你使用last-name仍是last_name亦或lastName都可以爲Pseron中對應的屬性賦值,這叫鬆散綁定

  1. @Value支持Spel這個能夠在以前的博文中看到 ,而 @ConfigurationProperties 是不支持的。
  2. 咱們在springmvc中使用過@Validated這個註解。在@ConfigurationProperties也是支持的,使用示例放在最後面
  3. 最後一點,@Value不可以對複雜類型進行賦值,如private Map<String,Object> maps;該屬性,就沒法在屬性加上

@Vavlue(${person.map})是拿不到值的。


@Validated應用舉例

改造一下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 [不是一個合法的電子郵件地址]
相關文章
相關標籤/搜索