Add additional grouping of property sources by profile
Before this change the PropertySources loaded from external config files were just added to the list for resolution in the order that they were loaded. That worked for simple cases, but when there are profiles active, and files themselves can activate profiles, it led to users not being able to change default settings easily (either on command line or in files, mostly in files). The solution proposed here is to group PropertySources by profile and resolve them in order of profile first, and then in order of the files being loaded. There are additional shenanigans because the order of the files being loaded also has to be carefully defined. The rule for users is that in a list of files to load (e.g. if set via spring.config.location), the last one wins (natural if you think of it as a merge of multiple maps). In addition, anything specified by a user takes precedence over the defaults (which was broken in some scenarios before). Additionally, fixes profile ordering in @ConfigurationProperties(path=...) Fixes gh-483pull/535/merge
parent
84cc110344
commit
48636e3d6e
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright 2012-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.env;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.core.env.EnumerablePropertySource;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
|
||||
/**
|
||||
* An mutable, enumerable, composite property source. New sources are added last (and
|
||||
* hence resolved with lowest priority).
|
||||
*
|
||||
* @see PropertySource
|
||||
* @see EnumerablePropertySource
|
||||
*
|
||||
* @author Dave Syer
|
||||
*/
|
||||
public class EnumerableCompositePropertySource extends
|
||||
EnumerablePropertySource<Collection<PropertySource<?>>> {
|
||||
|
||||
private volatile String[] names;
|
||||
|
||||
public EnumerableCompositePropertySource(String sourceName) {
|
||||
super(sourceName, new LinkedHashSet<PropertySource<?>>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getProperty(String name) {
|
||||
for (PropertySource<?> propertySource : getSource()) {
|
||||
Object value = propertySource.getProperty(name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getPropertyNames() {
|
||||
String[] result = this.names;
|
||||
if (result == null) {
|
||||
List<String> names = new ArrayList<String>();
|
||||
for (PropertySource<?> source : new ArrayList<PropertySource<?>>(getSource())) {
|
||||
if (source instanceof EnumerablePropertySource) {
|
||||
names.addAll(Arrays.asList(((EnumerablePropertySource<?>) source)
|
||||
.getPropertyNames()));
|
||||
}
|
||||
}
|
||||
this.names = names.toArray(new String[0]);
|
||||
result = this.names;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void add(PropertySource<?> source) {
|
||||
getSource().add(source);
|
||||
this.names = null;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue