|
|
@ -16,7 +16,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
package org.springframework.boot.context.properties;
|
|
|
|
package org.springframework.boot.context.properties;
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
@ -36,13 +35,11 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.beans.factory.config.BeanPostProcessor;
|
|
|
|
import org.springframework.beans.factory.config.BeanPostProcessor;
|
|
|
|
import org.springframework.boot.bind.PropertiesConfigurationFactory;
|
|
|
|
import org.springframework.boot.bind.PropertiesConfigurationFactory;
|
|
|
|
import org.springframework.boot.env.PropertySourcesLoader;
|
|
|
|
|
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
import org.springframework.context.ApplicationContextAware;
|
|
|
|
import org.springframework.context.ApplicationContextAware;
|
|
|
|
import org.springframework.context.ApplicationListener;
|
|
|
|
import org.springframework.context.ApplicationListener;
|
|
|
|
import org.springframework.context.ConfigurableApplicationContext;
|
|
|
|
import org.springframework.context.ConfigurableApplicationContext;
|
|
|
|
import org.springframework.context.EnvironmentAware;
|
|
|
|
import org.springframework.context.EnvironmentAware;
|
|
|
|
import org.springframework.context.ResourceLoaderAware;
|
|
|
|
|
|
|
|
import org.springframework.context.event.ContextRefreshedEvent;
|
|
|
|
import org.springframework.context.event.ContextRefreshedEvent;
|
|
|
|
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
|
|
|
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
|
|
|
import org.springframework.core.Ordered;
|
|
|
|
import org.springframework.core.Ordered;
|
|
|
@ -58,9 +55,6 @@ import org.springframework.core.env.MutablePropertySources;
|
|
|
|
import org.springframework.core.env.PropertySource;
|
|
|
|
import org.springframework.core.env.PropertySource;
|
|
|
|
import org.springframework.core.env.PropertySources;
|
|
|
|
import org.springframework.core.env.PropertySources;
|
|
|
|
import org.springframework.core.env.StandardEnvironment;
|
|
|
|
import org.springframework.core.env.StandardEnvironment;
|
|
|
|
import org.springframework.core.io.DefaultResourceLoader;
|
|
|
|
|
|
|
|
import org.springframework.core.io.Resource;
|
|
|
|
|
|
|
|
import org.springframework.core.io.ResourceLoader;
|
|
|
|
|
|
|
|
import org.springframework.util.Assert;
|
|
|
|
import org.springframework.util.Assert;
|
|
|
|
import org.springframework.util.ClassUtils;
|
|
|
|
import org.springframework.util.ClassUtils;
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
@ -77,10 +71,9 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
|
|
|
|
* @author Christian Dupuis
|
|
|
|
* @author Christian Dupuis
|
|
|
|
* @author Stephane Nicoll
|
|
|
|
* @author Stephane Nicoll
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public class ConfigurationPropertiesBindingPostProcessor
|
|
|
|
public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProcessor,
|
|
|
|
implements BeanPostProcessor, BeanFactoryAware, ResourceLoaderAware,
|
|
|
|
BeanFactoryAware, EnvironmentAware, ApplicationContextAware, InitializingBean,
|
|
|
|
EnvironmentAware, ApplicationContextAware, InitializingBean, DisposableBean,
|
|
|
|
DisposableBean, ApplicationListener<ContextRefreshedEvent>, PriorityOrdered {
|
|
|
|
ApplicationListener<ContextRefreshedEvent>, PriorityOrdered {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* The bean name of the configuration properties validator.
|
|
|
|
* The bean name of the configuration properties validator.
|
|
|
@ -107,8 +100,6 @@ public class ConfigurationPropertiesBindingPostProcessor
|
|
|
|
|
|
|
|
|
|
|
|
private BeanFactory beanFactory;
|
|
|
|
private BeanFactory beanFactory;
|
|
|
|
|
|
|
|
|
|
|
|
private ResourceLoader resourceLoader = new DefaultResourceLoader();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Environment environment = new StandardEnvironment();
|
|
|
|
private Environment environment = new StandardEnvironment();
|
|
|
|
|
|
|
|
|
|
|
|
private ApplicationContext applicationContext;
|
|
|
|
private ApplicationContext applicationContext;
|
|
|
@ -195,11 +186,6 @@ public class ConfigurationPropertiesBindingPostProcessor
|
|
|
|
this.beanFactory = beanFactory;
|
|
|
|
this.beanFactory = beanFactory;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void setResourceLoader(ResourceLoader resourceLoader) {
|
|
|
|
|
|
|
|
this.resourceLoader = resourceLoader;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public void setEnvironment(Environment environment) {
|
|
|
|
public void setEnvironment(Environment environment) {
|
|
|
|
this.environment = environment;
|
|
|
|
this.environment = environment;
|
|
|
@ -315,19 +301,12 @@ public class ConfigurationPropertiesBindingPostProcessor
|
|
|
|
return bean;
|
|
|
|
return bean;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("deprecation")
|
|
|
|
|
|
|
|
private void postProcessBeforeInitialization(Object bean, String beanName,
|
|
|
|
private void postProcessBeforeInitialization(Object bean, String beanName,
|
|
|
|
ConfigurationProperties annotation) {
|
|
|
|
ConfigurationProperties annotation) {
|
|
|
|
Object target = bean;
|
|
|
|
Object target = bean;
|
|
|
|
PropertiesConfigurationFactory<Object> factory = new PropertiesConfigurationFactory<Object>(
|
|
|
|
PropertiesConfigurationFactory<Object> factory = new PropertiesConfigurationFactory<Object>(
|
|
|
|
target);
|
|
|
|
target);
|
|
|
|
if (annotation != null && annotation.locations().length != 0) {
|
|
|
|
|
|
|
|
factory.setPropertySources(
|
|
|
|
|
|
|
|
loadPropertySources(annotation.locations(), annotation.merge()));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
factory.setPropertySources(this.propertySources);
|
|
|
|
factory.setPropertySources(this.propertySources);
|
|
|
|
}
|
|
|
|
|
|
|
|
factory.setValidator(determineValidator(bean));
|
|
|
|
factory.setValidator(determineValidator(bean));
|
|
|
|
// If no explicit conversion service is provided we add one so that (at least)
|
|
|
|
// If no explicit conversion service is provided we add one so that (at least)
|
|
|
|
// comma-separated arrays of convertibles can be bound automatically
|
|
|
|
// comma-separated arrays of convertibles can be bound automatically
|
|
|
@ -398,33 +377,6 @@ public class ConfigurationPropertiesBindingPostProcessor
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private PropertySources loadPropertySources(String[] locations,
|
|
|
|
|
|
|
|
boolean mergeDefaultSources) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
PropertySourcesLoader loader = new PropertySourcesLoader();
|
|
|
|
|
|
|
|
for (String location : locations) {
|
|
|
|
|
|
|
|
Resource resource = this.resourceLoader
|
|
|
|
|
|
|
|
.getResource(this.environment.resolvePlaceholders(location));
|
|
|
|
|
|
|
|
String[] profiles = this.environment.getActiveProfiles();
|
|
|
|
|
|
|
|
for (int i = profiles.length; i-- > 0;) {
|
|
|
|
|
|
|
|
String profile = profiles[i];
|
|
|
|
|
|
|
|
loader.load(resource, profile);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
loader.load(resource);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
MutablePropertySources loaded = loader.getPropertySources();
|
|
|
|
|
|
|
|
if (mergeDefaultSources) {
|
|
|
|
|
|
|
|
for (PropertySource<?> propertySource : this.propertySources) {
|
|
|
|
|
|
|
|
loaded.addLast(propertySource);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return loaded;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (IOException ex) {
|
|
|
|
|
|
|
|
throw new IllegalStateException(ex);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private ConversionService getDefaultConversionService() {
|
|
|
|
private ConversionService getDefaultConversionService() {
|
|
|
|
if (this.defaultConversionService == null) {
|
|
|
|
if (this.defaultConversionService == null) {
|
|
|
|
DefaultConversionService conversionService = new DefaultConversionService();
|
|
|
|
DefaultConversionService conversionService = new DefaultConversionService();
|
|
|
|