5

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

 2 years ago
source link: https://www.cnblogs.com/wang1221/p/16611778.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

都需要我们写在配置文件中,这样可以把这些配置文件放到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()去修改修改吧!!如果不需要动态更新的,看个人情况修改哈!!


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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK