源码解释:SpringBoot如果使用yml配置文件配置spring.profiles.active=01被识别成数字导致无法正确配置profile环境

现象描述

同样的配置,在 application.properties 解析出来是01,而在application.yml中解析出来是1

而如果你使用 --spring.profiles.active=01来配置也会被解析为01,那么会因为01和1不一致导致你的配置失效。

spring.profiles.active=01
spring:
  profiles:
  	active: 01

原因

  • yml配置文件有类型的概念,会把数字转成INT类型,所以01会被解析成1
  • properties配置文件只会解析为String类型

源码解释

发布事件

// 准备环境
run()
prepareEnvironment(listeners, applicationArguments);
listeners.environmentPrepared(environment);
listener.environmentPrepared(environment);
// 发布事件
this.initialMulticaster.multicastEvent(new ApplicationEnvironmentPreparedEvent(this.application, this.args, environment));
invokeListener(listener, event);
doInvokeListener(listener, event);
listener.onApplicationEvent(event);

在这里插入图片描述
ConfigFileApplicationListener#onApplicationEvent接收这个事件

onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);
onApplicationPreparedEvent(event);
postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());
addPropertySources(environment, application.getResourceLoader());
new Loader(environment, resourceLoader).load();
load(...)
private void load(PropertySourceLoader loader, String location, Profile profile, DocumentFilter filter,DocumentConsumer consumer){
	List<Document> documents = loadDocuments(loader, name, resource);
}
List<PropertySource<?>> loaded = loader.load(name, resource);

其中 loader.load 方法有两种实现,分别用于解析properties和yml
在这里插入图片描述
找到 YamlPropertySourceLoade

List<Map<String, Object>> loaded = new OriginTrackedYamlLoader(resource).load();
process((properties, map) -> result.add(getFlattenedMap(map)));
boolean found = process(callback, yaml, resource);
yaml.loadAll(reader)

在 yaml.loadAll中我们发现他使用了解析器 resolver

Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver, loadingConfig);

而解析器中使用正则判断了数据类型
在这里插入图片描述
所以就产生了以下的情况
在这里插入图片描述
而解析properties文件则不会,因为properties底层使用的是StringBuilder.append
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值