如何更优雅地获取spring boot yml中的值

前言

偶然看到国外论坛有人在吐槽同事从配置文件获取值的方式,因此查阅了相关资料发现确实有更便于管理更优雅的获取方式。

github demo地址: springboot-yml-value

1.什么是yml文件

application.yml取代application.properties,用来配置数据可读性更强,尤其是当我们已经制定了很多的层次结构配置的时候。

下面是一个非常基本的yml文件:

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文件如下:

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

2.yml属性获取配置

访问yml属性的一种方法是使用@Value("$ {property}")注释,但是随着配置树形结构以及数量的增加,代码可读性也随之降低,更不利于bean的管理。笔者发现另一种优雅的方法可以确保强类型bean的管理以及更方便的验证我们的程序配置。

为了实现这一点,我们将创建一个@ConfigurationProperties类ServerProperties,它映射一组相关的属性:

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.总结

欢迎移步github上手测试哦,地址在文首。有帮助的话点个赞吧,笔芯。转载需附上原文链接。

5.补充

因为有小伙伴不太清楚具体用途。笔者补充一下两者的优缺点吧。

Spring Boot通过ConfigurationProperties注解从配置文件中获取属性。从上面的例子可以看出ConfigurationProperties注解可以通过设置prefix指定需要批量导入的数据。支持获取字面值,集合,Map,对象等复杂数据。ConfigurationProperties注解还有其他特点呢?它和Spring的Value注解又有什么区别呢?

一)ConfigurationProperties和@Value优缺点

ConfigurationProperties注解的优缺点

一、可以从配置文件中批量注入属性;

二、支持获取复杂的数据类型;

三、对属性名匹配的要求较低,比如user-name,user_name,userName,USER_NAME都可以取值;

四、支持JAVA的JSR303数据校验;

五、缺点是不支持SpEL表达式;

六、确保强类型bean的管理,更方便的验证程序配置;

Value注解的优缺点正好相反,它只能一个个配置注入值;不支持数组、集合等复杂的数据类型;不支持数据校验;对属性名匹配有严格的要求。最大的特点是支持SpEL表达式,使其拥有更丰富的功能。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • spring boot装载自定义yml文件

    yml格式的配置文件感觉很人性化,所以想把项目中的.properties都替换成.yml文件,主要springboot自1.5以后就把@configurationProperties中的location参数去掉,各种查询之后发现可以用YamlPropertySourceLoader去装载yml文件,上代码 public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { ResourceLoader loade

  • Spring Boot使用yml格式进行配置的方法

    1.yml 格式 现在大家发现,在springboot里还是要用到配置文件的. 除了使用.properties外,springboot还支持 yml格式. 个人觉得yml格式的可读性和..properties比起来差不多,有时候还没有不如properties 看起来那么规整. 但是考虑到很多springboot项目会使用yml格式,还是简单讲讲,主要目的还是为了读懂其他人的项目. 2.同样内容,不同写法 如图所示,左边是application.properties的写法,右边是applicati

  • SpringBoot获取yml和properties配置文件的内容

    (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @ConfigurationProperties 注解 --> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor --> <dependency> <groupId>org.springframework.boot</groupId>

  • 详解Spring Boot加载properties和yml配置文件

    一.系统启动后注入配置 package com.example.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframewo

  • springboot如何读取配置文件(application.yml)中的属性值

    在spring boot中,简单几步,读取配置文件(application.yml)中各种不同类型的属性值: 1.引入依赖: <!-- 支持 @ConfigurationProperties 注解 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId>

  • 解决idea不支持SpringBoot yml文件的图文教程

    再初用SpringBoot时肯定会遇到这样的问题: 为什么idea不支持yml? 为什么idea的yml文件没有提示? 为什么idea的yml不识别? 第一个问题解答  1.安装YAML插件 2.再Settings中找到File Types然后找YAML看看是否有yml后缀名 第二个问题为什么没有提示? 1.安装插件SnakeYAML plugin即可 第三个问题:大坑! 以上问题还是不能解决,那么 1.看看你项目的结构你的resource是一个文件夹还是一个resource的包 2.是否是id

  • Spring Boot中优雅的获取yml文件工具类

    如何在spring boot中优雅的获取.yml文件工具类呢 代码如下: package com.common.base.utils.base; import com.common.base.generator.ResourceManager; import org.yaml.snakeyaml.Yaml; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * yml文件工具类 */ p

  • SpringBoot通过yml和xml文件配置日志输出方法

    SpringBoot中默认使用Logback进行日志输出,可以同时使用SpringBoot框架的配置文件application.yml或是通过logback的配置文件logback.xml进行配置. 通过application.yml配置 <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 Lo

  • spring-boot读取props和yml配置文件的方法

    最近微框架spring-boot很火,笔者也跟风学习了一下,废话不多说,现给出一个读取配置文件的例子. 首先,需要在pom文件中依赖以下jar包 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <d

  • Spring Boot 中application.yml与bootstrap.yml的区别

    yml与properties 其实yml和properties文件是一样的原理,且一个项目上要么yml或者properties,二选一的存在. 推荐使用yml,更简洁. bootstrap与application 1.加载顺序 这里主要是说明application和bootstrap的加载顺序. •bootstrap.yml(bootstrap.properties)先加载 •application.yml(application.properties)后加载 bootstrap.yml 用于应

随机推荐