一、前言
我们在开发中会经常遇到一些可能会变的值,比如数据库的密码,一些关键链接的配置等等。
都需要我们写在配置文件中,这样可以把这些配置文件放到nacos上进行管理,修改nacos的配置,咱们发布的包就可以动态的进行更新了,不需要重新修改打包在重新发包!
咱们今天就来说一说读取配置文件中的值常见的两种方法,刚刚说的动态更新配置的是第二种配置哈! @Value(“${school.teacher}”) 不会动态更新,所以小编推荐使用第二种方式 @ConfigurationProperties(prefix = “school”) 进行读取配置文件!下面小编 也会带大家一起演示一下不需要重启项目就可以动态的更新,在生产上非常的好用!!!
二、第一种方式
第一种方式比较场景,也是最简单的,就是 @Value($(配置文件中的参数))
我们首先在application.yml文件中写一个配置:
school: | |
teacher: 王老师 | |
student: 小明 |
==这里key的 冒号 后面一定要有个空格==,字符串不需要加 双引号 !
我们为了方便直接在controller进行演示了!!
@RestController | |
@ Request Mapping("/test") | |
@Slfj | |
@RequiredArgs Constructor | |
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/8/17 9:04 | |
*/ | |
// 要交给spring容器,不然获取不到值 | |
// 配置读取yml文件中前缀以 school开头的配置可以全部读取 | |
// 要有get方法,不然无法获取值 | |
public class School { | |
// 名称要与yml一致 | |
private String teacher; | |
private List<String> studentList; | |
} |
3. 在Controller进行测试
@RestController | |
@RequestMapping("/test") | |
@Slfj | |
@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是一个成员变量,我们直接看一下这个类吧!
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() 去修改修改吧!如果不需要动态更新的,看个人情况修改