欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-14 07:58:35
前言 偶然看到国外论坛有人在吐槽同事从配置文件获取值的方式,因此查阅了相关资料发现确实有更便于管理更优雅的获取方式。 github demo地址: 1.什么是y...

前言

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

github demo地址:

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());
 }
}

测试结果如下:

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

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表达式,使其拥有更丰富的功能。

总结

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