bootstrap.yaml和application.yaml

230 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

今天启动项目时,我在Controller里通过@Value去获取application配置里的属性值,怎么也获取不到,但是在配置类的bean里却可以取到对应的值,就很好奇起来了,但是我晚上本地验又验不出来,如果需要可以直接去官网查看官方解释externalized configuration

首先我们通常在resource目录下建application.yaml,我也是,但我的@value就取不到值,然后没想啥就打包放到了我的服务器上去了,启动,居然可以取到值,百度了好久;网上列的是没有纳入Spring的管理,我用的是@RestController注解,反正没取到;再看看,spring对我们的配置文件加载有一个顺序作用,首先他会先加载我们项目根的config下的配置文件,不存在,继续查找项目根下的配置文件,还不存在会查找我们resource下config文件夹,依然不存在才会查找resource下的配置,如果我们的配置是properties和yaml并存,则优先properties加载;

你以为我就这么多,那太天真;刚刚又实验一把,我们把application.yaml的active=dev删掉,直接在上面写配置,而不是分开发配置和生产配置的形式,那么我们会发现我们的@value取不到值了,那就说明配置里的profile会对我们的配置读取以及spring的管理产生影响;我们都知道bootstrap配置是最早进行加载的,所有我们在这里写上某些配置是一定能被读取到的,比如我们可以把应用名写在这里,如果我们的配置只有bootstrap和application而没有application-dev那么一点事都没,各配置间不会覆盖,如果存在-dev,那么-dev里的配置会覆盖我们的配置(这个官方文档也有说明它会总是覆盖非特定的文件);

综上,我猜测,我们首先加载bootstrap的时候已经将值读到了,待到spring启动时,并可以轻而易举拿到值,但是如果你直接写在application里呢,spring启动时对于某些注解来说他可能取不到对应的值,对于比如说配置类的,它会去再读取配置文件就可以取到,但对于方法来说它读不到配置文件;

如果我们的配置文件以独立文件存储在jar外(下图第14、15),它会优先于我们的内部配置加载所以它会给我们的value注解赋值,而如果你用-dev的方式呢,因为-dev存在覆盖的行为,相当于把dev的内容又写了内存一遍,强烈建议大家看看官方文档;