• SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用


    一、前言

    我们在开发中会经常遇到一些可能会变的值,比如数据库的密码,一些关键链接的配置等等。

    都需要我们写在配置文件中,这样可以把这些配置文件放到nacos上进行管理,修改nacos的配置,咱们发布的包就可以动态的进行更新了,不需要重新修改打包在重新发包!

    咱们今天就来说一说读取配置文件中的值常见的两种方法,刚刚说的动态更新配置的是第二种配置哈!@Value("${school.teacher}")不会动态更新,所以小编推荐使用第二种方式@ConfigurationProperties(prefix = "school")进行读取配置文件!下面小编 也会带大家一起演示一下不需要重启项目就可以动态的更新,在生产上非常的好用!!!

    二、第一种方式

    第一种方式比较场景,也是最简单的,就是@Value($(配置文件中的参数))

    我们首先在application.yml文件中写一个配置:

    school:
     teacher: 王老师
     student: 小明
    

    这里key的冒号后面一定要有个空格,字符串不需要加双引号!

    我们为了方便直接在controller进行演示了!!

    @RestController
    @RequestMapping("/test")
    @Slf4j
    @RequiredArgsConstructor
    public class TestController {
    
        @Value("${school.teacher}")
        private String teacher;
    
        @Value("${school.student}")
        private String student;
    
        @GetMapping("/testValue")
        public Result testValue(){
            return Result.success(teacher + "--->" + student);
        }
    }
    

    我们debug看一下是否可以读取到配置中的值!

    在这里插入图片描述

    我们可以看到是有值的!

    三、第二种方式(推荐)

    这种方式是小编比较推荐的,虽然看似比@Value麻烦不少,但是更加的规范,在配合nacos的时候也可以动态的修改,会立即生效,一会小编带大家试一下哈!!为什么推荐这种方式呢,是因为spring他们都是使用这种方式进行配置的,所以跟着官方走不会有错的!!

    1. 修改yml文件

    我们刚刚修改了一下yml配置文件,让类型更加丰富!!

    school:
     teacher: 王老师
     studentList:
       - 小明
       - 小刚
    

    2. 编写读取映射的类

    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    
    /**
     * @author wangzhenjun
     * @date 2022/8/17 9:04
     */
    // 要交给spring容器,不然获取不到值
    @Component
    // 配置读取yml文件中前缀以 school开头的配置可以全部读取
    @ConfigurationProperties(prefix = "school")
    // 要有get方法,不然无法获取值
    @Data
    public class School {
    
        // 名称要与yml一致
        private String teacher;
    
        private List studentList;
    }
    
    

    3. 在Controller进行测试

    @RestController
    @RequestMapping("/test")
    @Slf4j
    @RequiredArgsConstructor
    public class TestController {
    
        @Autowired
        private School school;
    
        @GetMapping("/testProperties")
        public void testProperties(){
            log.info("读取yml的school对象:{}",school);
        }
    }
    

    4. debug进行看一下

    在这里插入图片描述

    5. 为什么推荐第二种方式

    我们找到yml文件,按住Ctrl鼠标点击port,进去看一下spring官方是怎么配置的!

    在这里插入图片描述
    我们来到ServerProperties这个配置类上看到:

    public void setPort(Integer port) {
    	this.port = port;
    }
    

    我们发现port是一个成员变量,我们直接看一下这个类吧!

    @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
    public class ServerProperties {
    
    	/**
    	 * Server HTTP port.
    	 */
    	private Integer port;
    }
    

    我们看到spring也是使用第二种方式进行读取yml的内容的!!

    四、验证第二种方式实时更新

    nacos这里小编就不带大家整合到项目中了,小编直接演示效果哈!

    1. nacos上配置yml

    school:
     teacher: 王老师
     studentList:
       - 小明
       - 小刚
    

    在这里插入图片描述
    读取的配置和第二种方式那个School一样!

    2. Controller获取

    @RestController
    @RequiredArgsConstructor
    @RequestMapping("/zone")
    public class ZoneController {
    	@Autowired
        private School school;
    
        @GetMapping("/test")
        public R test() {
            return R.ok(school);
        }
    

    3. postman测试

    在这里插入图片描述

    4. 修改配置

    我们修改配置不重启项目
    在这里插入图片描述
    在次测试:
    在这里插入图片描述
    大功告成!完结撒花喽!!

    五、总结

    第二种方式:@ConfigurationProperties是非常推荐大家使用的,能够规范和生产环境中动态生效!!真的很香啊!!项目中的@Value()去修改修改吧!!如果不需要动态更新的,看个人情况修改哈!!


    有缘人才可以看得到的哦!!!

    点击访问!小编自己的网站,里面也是有很多好的文章哦!

  • 相关阅读:
    一天梳理完react面试题
    MySql
    C++虚函数
    Springboot中的三层架构
    康耐视深度学习ViDi-Database菜单介绍
    基础算法训练(五)折半插入排序
    Python并行运算——threading库详解(持续更新)
    Spring事件监听机制源码解析
    ChatGPT基本原理
    机器学习实战-朴素贝叶斯
  • 原文地址:https://www.cnblogs.com/wang1221/p/16611778.html