服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - SpringBoot实现加载yml文件中字典数据

SpringBoot实现加载yml文件中字典数据

2023-05-30 10:59VipSoft Java教程

这篇文章主要为大家详细介绍了SpringBoot如何实现加载yml文件中字典数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下

将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中

Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如:resources)下新建application-xxx

必须以application开头的yml文件, 多个文件用 "," 号分隔,不能换行

项目结构文件

SpringBoot实现加载yml文件中字典数据

application.yml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
  port: 8088
  application:
    name: VipSoft Env Demo
 
 
spring:
  profiles:
    include:
      dic      # 在配置文件目录(如:resources)下新建application-xxx 开头的yml文件, 多个文件用 "," 号分隔,不能换行
 
#性别字典
user-gender:
  0: 未知
  1:
  2:

application-dic.yml

将字典独立到单独的yml文件中

?
1
2
3
4
#支付方式
pay-type:
  1: 微信支付
  2: 货到付款

在 resources 目录下,创建META-INF目录,创建 spring.factories文件,

Spring Factories是一种类似于Java SPI的机制,它在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。

内容如下:

?
1
2
# Environment Post Processor
org.springframework.boot.env.EnvironmentPostProcessor=com.vipsoft.web.utils.ConfigUtil

ConfigUtil

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.vipsoft.web.utils;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.properties.bind.BindResult;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.util.Assert;
 
public class ConfigUtil implements EnvironmentPostProcessor {
 
    private static Binder binder;
 
    private static ConfigurableEnvironment environment;
 
    public static String getString(String key) {
        Assert.notNull(environment, "environment 还未初始化!");
        return environment.getProperty(key, String.class, "");
    }
 
    public static <T> T bindProperties(String prefix, Class<T> clazz) {
        Assert.notNull(prefix, "prefix 不能为空");
        Assert.notNull(clazz, "class 不能为空");
        BindResult<T> result = ConfigUtil.binder.bind(prefix, clazz);
        return result.isBound() ? result.get() : null;
    }
 
    /**
    * 通过 META-INF/spring.factories,触发该方法的执行,进行环境变量的加载
    */
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        for (PropertySource<?> propertySource : environment.getPropertySources()) {
            if (propertySource.getName().equals("refreshArgs")) {
                return;
            }
        }
        ConfigUtil.environment = environment;
        ConfigUtil.binder = Binder.get(environment);
    }
}

DictVo

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.vipsoft.web.vo;
 
 
public class DictVO implements java.io.Serializable {
    private static final long serialVersionUID = 379963436836338904L;
    /**
     * 字典类型
     */
    private String type;
    /**
     * 字典编码
     */
    private String code;
    /**
     * 字典值
     */
    private String value;
 
    public DictVO(String code, String value) {
        this.code = code;
        this.value = value;
    }
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public String getCode() {
        return code;
    }
 
    public void setCode(String code) {
        this.code = code;
    }
 
    public String getValue() {
        return value;
    }
 
    public void setValue(String value) {
        this.value = value;
    }
}

DefaultController

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.vipsoft.web.controller;
 
import com.vipsoft.web.utils.ConfigUtil;
import com.vipsoft.web.vo.DictVO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
 
 
@RestController
public class DefaultController {
    @GetMapping(value = "/")
    public String login() {
        return "VipSoft Demo !!!";
    }
 
    @GetMapping("/list/{type}")
    public List<DictVO> listDic(@PathVariable("type") String type) {
        LinkedHashMap dict = ConfigUtil.bindProperties(type.replaceAll("_", "-"), LinkedHashMap.class);
        List<DictVO> list = new ArrayList<>();
        if (dict == null || dict.isEmpty()) {
            return list;
        }
        dict.forEach((key, value) -> list.add(new DictVO(key.toString(), value.toString())));
        return list;
    }
}

运行效果

SpringBoot实现加载yml文件中字典数据

单元测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.vipsoft.web;
 
import com.vipsoft.web.controller.DefaultController;
import com.vipsoft.web.utils.ConfigUtil;
import com.vipsoft.web.vo.DictVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.util.List;
 
@SpringBootTest
public class DicTest {
    @Autowired
    DefaultController defaultController;
 
    @Test
    public void DicListTest() throws Exception {
        List<DictVO> pay_type = defaultController.listDic("pay-type");
        pay_type.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue()));
 
 
        List<DictVO> user_gender = defaultController.listDic("user-gender");
        user_gender.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue()));
    }
 
 
    @Test
    public void getString() throws Exception {
        String includeYml = ConfigUtil.getString("spring.profiles.include");
        System.out.println("application 引用了配置文件 =》 " + includeYml);
    }
}

SpringBoot实现加载yml文件中字典数据

以上就是SpringBoot实现加载yml文件中字典数据的详细内容,更多关于SpringBoot加载yml文件字典数据的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/vipsoft/p/17332858.html

延伸 · 阅读

精彩推荐
  • Java教程Java之String[] args含义及作用

    Java之String[] args含义及作用

    这篇文章主要介绍了Java之String[] args含义及作用,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    小熊没有了6232021-11-14
  • Java教程浅谈java中的移动位运算:,>>>

    浅谈java中的移动位运算:,>>>

    这篇文章主要介绍了java中的移动位运算:,>>>文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    weixin_344141966482021-07-19
  • Java教程springboot基于IDEA环境热加载与热部署教程

    springboot基于IDEA环境热加载与热部署教程

    这篇文章主要为大家介绍了springboot在IDEA环境下的热加载与热部署教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...

    字母哥博客7912022-10-07
  • Java教程Java mybatis常见问题及解决方案

    Java mybatis常见问题及解决方案

    这篇文章主要介绍了Java mybatis常见问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    七月在野,八月在宇3862020-08-02
  • Java教程Java多线程编程详细解释

    Java多线程编程详细解释

    这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考...

    山高我为峰11432022-07-07
  • Java教程Java Spring快速入门

    Java Spring快速入门

    本文主要介绍了SpringSpring简介和入门知识。具有一定的参考价值,下面跟着小编一起来看下吧...

    SuperRoot4112020-07-30
  • Java教程Java定义画板类的方法

    Java定义画板类的方法

    这篇文章主要为大家详细介绍了Java定义画板类的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    李晓nic8582023-02-23
  • Java教程Spring Boot整合Mybatis Plus和Swagger2的教程详解

    Spring Boot整合Mybatis Plus和Swagger2的教程详解

    这篇文章主要介绍了Spring Boot整合Mybatis Plus和Swagger2的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    野生D程序猿7012021-08-12