@ConfigurationProperties獲取springboot yml中的複雜數據

偶然看到國外論壇有人在吐槽同事從配置文件獲取值的方式太過冗長和臃腫,便有了這篇文章java

github demo地址: springboot-yml-valuegit

1.什麼是yml文件

application.yml取代application.properties,用來配置數據可讀性更強,尤爲是當咱們已經制定了不少的層次結構配置的時候。yml支持聲明map,數組,list,字符串,boolean值,數值,NULL,日期,基本知足開發過程當中的全部配置。github

下面是一個很是基本的yml文件:spring

server:
    url: http://localhost 
    myapp:
        name: MyApplication
        threadCount: 4
...
複製代碼

等同於如下的application.properties文件:數組

server.url=http://localhost
server.myapp.name=MyApplication
server.myapp.threadCount=4
...
複製代碼

demo中的yml文件以下:springboot

server:
    url: http://myapp.org 
    app:
        name: MyApplication
        threadCount: 10
        users: 
          - Jacob
          - James
複製代碼

2.yml屬性獲取配置

訪問yml屬性的一種方法是使用@Value("$ {property}")註釋,可是隨着配置樹形結構以及數量的增長,代碼可讀性也隨之下降,更不利於bean的管理。筆者發現另外一種優雅的方法能夠確保強類型bean的管理以及更方便的驗證咱們的程序配置。數據結構

爲了實現這一點,咱們將建立一個@ConfigurationProperties類ServerProperties,它映射一組相關的屬性:app

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/** * @program: simple-demo * @description: 映射屬性 (server節點) * @author: CaoTing * @date: 2019/6/3 **/
@Data
@ConfigurationProperties("server")
public class ServerProperties {
 
    private String url;
 
    private final App app = new App();
 
    public App getApp() {
        return app;
    }
 
    public static class App {
 
        private String name;
        private String threadCount;
        private List<String> users = new ArrayList<>();
        // TODO getter and setter
    }
    
}
複製代碼

請注意,咱們能夠建立一個或多個@ConfigurationProperties類。單元測試

定義咱們的springboot 註冊配置類ApplicationConfig:測試

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/** * @program: simple-demo * @description: 註冊全部映射屬性類 { }中用逗號分隔便可註冊多個屬性類 * @author: CaoTing * @date: 2019/6/3 **/
@Configuration
@EnableConfigurationProperties({ServerProperties.class})
public class ApplicationConfig {
}
複製代碼

這裏已經提到了要在@EnableConfigurationProperties中註冊的屬性類列表。

3.訪問yml屬性

如今能夠經過使用建立的@ConfigurationProperties bean來訪問yml屬性。能夠像任何常規的Spring bean同樣注入這些屬性bean,測試類以下:

import com.caotinging.ymldemo.application.YmlValueApplication;
import com.caotinging.ymldemo.config.ServerProperties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/** * @program: simple-demo * @description: 單元測試類 * @author: CaoTing * @date: 2019/6/3 **/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = YmlValueApplication.class)
public class AppYmlValueTest {

    @Autowired
    private ServerProperties config;

    @Test
    public void printConfigs() {
            System.out.println(this.config.getUrl());
            System.out.println(this.config.getApp().getName());
            System.out.println(this.config.getApp().getThreadCount());
            System.out.println(this.config.getApp().getUsers());
    }
}
複製代碼

測試結果以下:

測試結果

4.補充

由於有小夥伴不太清楚具體用途。筆者補充一下二者的優缺點吧。

Spring Boot經過ConfigurationProperties註解從配置文件中獲取屬性。從上面的例子能夠看出ConfigurationProperties註解能夠經過設置prefix指定須要批量導入的數據。支持獲取字面值,集合,Map,對象等複雜數據。ConfigurationProperties註解還有其餘特色呢?它和Spring的Value註解又有什麼區別呢?

一)ConfigurationProperties和@Value優缺點

ConfigurationProperties註解的優缺點

1、能夠從配置文件中批量注入屬性;

2、支持獲取複雜的數據類型;

3、對屬性名匹配的要求較低,好比user-name,user_name,userName,USER_NAME均可以取值;

4、支持JAVA的JSR303數據校驗;

5、缺點是不支持SpEL表達式;

6、確保強類型bean的管理,更方便的驗證程序配置;

Value註解的優缺點正好相反,它只能一個個配置注入值;不支持數組、集合等複雜的數據類型;不支持數據校驗;對屬性名匹配有嚴格的要求。最大的特色是支持SpEL表達式,使其擁有更豐富的功能。

回答評論區小夥伴的疑問

第一個屬性就是個數組的時候怎麼辦呢?

yml示例以下

orgs:
    - math
    - chinese
    - english
複製代碼

只須要以下這樣一個bean就能輕鬆獲取哦。

/** * @program: simple-demo * @description: 映射Org屬性 * @author: CaoTing * @date: 2019/6/6 **/
@Data
@ConfigurationProperties
public class OrgProperties {
    private List<String> orgs;
}
複製代碼

不過別忘記在註冊類那裏註冊一下

@EnableConfigurationProperties({ServerProperties.class, OrgProperties.class})
複製代碼

github倉庫也更新了這部分代碼,歡迎前往測試哦,地址在文首。

還有map以及其餘更復雜的數據結構均可以實現,我就不一個個測試了。

原創不易,轉載請附上原文連接,有幫助的話點個贊吧,筆芯。

相關文章
相關標籤/搜索