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<String> 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()去修改修改吧!!如果不需要动态更新的,看个人情况修改哈!

责任编辑:姜华 来源: 小王博客基地
相关推荐

2010-08-02 16:58:08

Flex配置文件

2009-06-02 14:12:26

Hibernate配置文件格式

2010-08-06 09:38:11

Flex读取XML

2009-06-25 13:43:00

Buffalo AJA

2019-08-09 09:00:40

cp命令BashLinux

2022-01-26 00:36:24

vue组件化通信

2023-08-07 16:14:32

propertiesSpring框架

2010-08-03 09:20:33

Flex读取XML配置

2023-05-31 19:10:31

2022-01-17 09:01:41

Pythonnc文件Python基础

2021-06-30 07:19:34

SpringBoot定时任务

2010-03-29 18:31:09

Nginx配置

2021-05-27 10:57:01

TCP定时器网络协议

2015-10-30 11:22:44

文件哈希校验方式Windows

2022-01-19 13:57:22

ymlSpringSnakeYml

2023-03-29 13:06:36

2022-08-15 07:06:50

Propertiesyml配置

2022-08-17 07:06:14

SpringBoot配置@Value

2010-10-21 16:24:18

sql server升

2017-12-13 14:41:45

点赞
收藏

51CTO技术栈公众号