通常情況下,在項目中都會有一些配置類,在配置初始化時候需要導入yml配置中配置好的值,很多情況下我們都能將簡單類型值注入,如String,Integer,但是對于List或者Map注入確一知半解。本文主要是講解一下使用何種方式能夠成功注入不同類型數數據,并加以區分。
首先來幾個例子
package org.jeecg.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* Description
* <p>
* </p>
* DATE 2020/4/3.
*
* @author zyq.
*/
@Data
@Component
@ConfigurationProperties(prefix = "test")
public class DemoConfiguration {
/**
* yaml和Properties都支持
* 通過橫線連接的形式注入
* test:
* str-demo1: str-demo1
*/
private String strDemo1;
/**
* yaml和Properties都支持
* 通過小駝峰形式
* test:
* strDemo2: strDemo2
*/
private String strDemo2;
/** yaml和Properties都支持
* 通過下劃線連接注入
* test:
* str_demo3: str_demo3
*/
private String strDemo3;
/**
* yaml支持
* Standard YAML list syntax:
* test:
* list-demo1:
* - demo11
* - demo12
*/
private List<String> listDemo1;
/**
* yaml和Properties配置文件支持
* 數組形式,Standard list syntax using [ ]
* test:
* list-demo2[0]: demo21
* list-demo2[1]: demo22
*/
private List<String> listDemo2;
/**
* yaml和Properties都支持
* 通過逗號分隔
* list-demo3: demo31,dem32
*/
private List<String> listDemo3;
/**
* yaml支持
* 通過@Value形式注入失敗, @Value("${test.map-demo1}")
* 直接通過ConfigurationProperties(prefix = "test")配合注入
* test:
* map-demo1:
* key1: value1
* key2: value2
*/
private Map<String,String> mapDemo1;
/**
* yaml和Properties都支持
* 該情況下只能通過@Value的Spel注入
* test:
* map-demo2: "{key1: 'value1', key2: 'value2'}"
*/
@Value("#{${test.map-demo2}}")
private Map<String,String> maps;
}
在上述的例子中主要是對String、List和Map進行對比試驗。
@ConfigurationProperties(prefix = "test")的引入,是的再寫重復的@Value,能夠將配置中的數據完全映射。特別是map的使用更加簡單,不需要使用@ValueSpel表達式,就能搞定映射。
關于map和list在的代碼中已經完全體現,并做了詳細對比。
當然,不使用@Value的情況下,可能我們在查找某一個配置文件的值的就比較麻煩了。所以還是需要結合個人習慣、公司規范以及業務邏輯上選取最優的使用方式。
最后關于配置文件注解的還有很多騷操作,本文不再一一舉例,參考官方文檔
這里引用一下官方的ConfigurationProperties和Value的對比
@ConfigurationProperties和@Value