@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以及其余更复杂的数据结构均可以实现,我就不一个个测试了。

原创不易,转载请附上原文连接,有帮助的话点个赞吧,笔芯。

相关文章
相关标签/搜索