1. 程式人生 > >SpringBoot @Value 獲取值和@ConfigurationProperties獲取值比較

SpringBoot @Value 獲取值和@ConfigurationProperties獲取值比較

[email protected]獲取值和@ConfigurationProperties獲取值比較

  @ConfigurationProperties

@Value

功能

批量注入配置檔案中的屬性

一個個指定

鬆散繫結(鬆散語法)

支援

不支援

SpEL

不支援

支援

JSR303資料校驗

支援

不支援

複雜型別封裝

支援

不支援

無論配置檔案yaml還是properties他們都能獲取到值;

如果說,我們在只是在某個業務中獲取一下配置檔案中的某項值,使用@Value;

如果說,我們專門編寫了一個JavaBean和配置檔案進行對映,我們就直接使用onfigurationProperties;

2.舉例解釋(此處以yaml檔案為例)

application.yaml

server:
    port: 8081
person:
    lastName: 張三
    age: 18
    boss: true
    birth: 2018/12/02
    map: {k1: c,k2: z}
    lists:
       - zz
       - bb
    dog:
      name: Tom
      age: 12
       

javabean

package com.hbsi.bean;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.validation.constraints.Email;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
/*
 *  將配置檔案中配置的每一個屬性的值,對映到這個元件
 *  @ConfigurationProperties:告訴SpringBoot將本類中所有屬性和配置檔案中相關的配置進行繫結;
 *  只有這個元件是容器中的元件,才能用容器提供的@ConfigurationProperties功能
 */
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
	//可以通過@Value獲取配置檔案中某一個值
	 @Email
	private String lastName;
	private Integer age;
	private boolean boss;
	private Date birth;
	private Map<String, String> map;
	private List lists;
	private Dog dog;
}

(1) 鬆散繫結(此時用@ConfigutationPropertis)

application.yaml中的(application.propertiest同樣可以用以下規則)

屬性名匹配規則可以是 

   pseron:

  lastName:使用標準方式

  last_name:大寫用-

  last-name:大寫用-

(2)支援SpEL表示式(此時用@Value)

public class Person {
	
	private String lastName;
	@Value("#{11*2}")
	private Integer age;
	private boolean boss;
	private Date birth;
	private Map<String, String> map;
	private List lists;
	private Dog dog;
}

(3)支援資料校驗(此時用ConfigutationPropertis)

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
	
	 @Email//判斷lastName是不是email格式
	private String lastName;
	private Integer age;
	private boolean boss;
	private Date birth;
	private Map<String, String> map;
	private List lists;
	private Dog dog;
}

控制檯輸出為

Property: person.lastName
    Value: 張三
    Origin: class path resource [application.yml]:4:15
    Reason: 不是一個合法的電子郵件地址

(4)複雜型別封裝

@Configuration支援(map,list)

server:
    port: 8081
person:
    map: {k1: c,k2: z}
    lists:
       - zz
       - bb
    dog:
      name: Tom
      age: 12
       

@Value不支援

@Value("person.map")
	private Map<String, String> map;