现象描述
同样的配置,在 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