当前位置: 首页 > 科技观察

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

时间:2023-03-20 10:17:01 科技观察

1.前言我们经常会遇到一些在开发过程中可能会发生变化的值,比如数据库密码和一些关键链接的配置和很快。我们需要写在配置文件中,这样我们就可以把这些配置文件放到nacos上进行管理,修改nacos的配置,我们发布的包可以动态更新,不需要重新修改包和重新发送包裹!今天就来说说读取配置文件中值的两种常用方法。刚刚说的动态更新配置就是第二种配置!@Value("${school.teacher}")不会动态更新,所以我推荐使用第二种方法@ConfigurationProperties(prefix="school")读取配置文件!下面小编也会给大家展示一下,不用重启项目也可以动态更新,在生产中非常有用!2.第一种方式第一种方式比较场景也是最简单的,就是@Value($(配置文件中的参数))。我们先在application.yml文件中写一个配置:学校:老师:王老师学生:小明这里key的冒号后面要有一个空格,字符串不需要加双引号!为了方便,我们直接在controller中演示!!@RestController@RequestMapping("/test")@Slf4j@RequiredArgsConstructorpublicclassTestController{@Value("${school.teacher}")privateStringteacher;@Value("${school.student}")私人字符串学生;@GetMapping("/testValue")publicResulttestValue(){returnResult.success(teacher+"--->"+student);}}让我们调试看看我们是否可以读取配置中的值!我们可以看到这是值得的!3.第二种方法(推荐)小编推荐这种方法。虽然看起来比@Value麻烦很多,但是更加规范。配合nacos也可以动态修改,即时生效。小编就带大家去试试吧!!为什么推荐这种方法?因为都是用这个方法来配置spring的,所以跟着官方也没什么问题!1.修改yml文件我们刚刚修改了yml配置文件,让类型更加丰富!school:teacher:王老师studentList:-小明-小刚2.写一个读取映射的类importjava.util.List;/***@authorwangzhenjun*@date2022/8/179:04*///必须交给spring容器,否则取不到值@Component//Configuration读取yml文件中所有前缀为school开头的配置可以读取@ConfigurationProperties(prefix="school")//必须有get方法,否则取不到值@DatapublicclassSchool{//名称必须与yml一致privateStringteacher;privateListstudentList;}3.在控制器中测试@RestController@RequestMapping("/test")@Slf4j@RequiredArgsConstructorpublicclassTestController{@AutowiredprivateSchoolschool;@GetMapping("/testProperties")publicvoidtestProperties(){log.info("读取yml的学校对象:{}",school);}}4.看看debug5.为什么推荐第二种方法?我们找到yml文件,按住Ctrl鼠标点击端口进去,看看spring官方是怎么配置的!我们来到ServerProperties的配置类看到:publicvoidsetPort(Integerport){this.port=port;}我们发现port是一个成员变量,我们直接看这个类吧!@ConfigurationProperties(prefix="server",ignoreUnknownFields=true)publicclassServerProperties{/***服务器HTTP端口。*/privateIntegerport;}我们看到spring也是使用第二种方式读取yml的内容!4.验证第二种方法是实时更新nacos。在这里,我就不带大家将其集成到项目中了。我直接演示效果!1.在nacos上配置ymlschool:teacher:王老师studentList:-小明-小刚读取的配置和第二种方式学校的配置是一样的!2.控制器获取@RestController@RequiredArgsConstructor@RequestMapping("/zone")publicclassZoneController{@AutowiredprivateSchoolschool;@GetMapping("/test")publicRtest(){returnR.ok(school);}3、postman测试4.修改配置我们在不重启项目的情况下修改配置:下一个测试:大功告成!花开了!!5.总结第二种方法:@ConfigurationProperties非常推荐大家使用,在规范和生产环境下都可以动态生效!真香!项目中的@Value()来修改吧!!如果不需要动态更新,可以根据个人情况自行修改!