@ -27,6 +27,8 @@ import java.util.List;
import java.util.Queue ;
import java.util.Queue ;
import java.util.Set ;
import java.util.Set ;
import org.apache.commons.logging.Log ;
import org.apache.commons.logging.LogFactory ;
import org.springframework.beans.BeansException ;
import org.springframework.beans.BeansException ;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor ;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor ;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory ;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory ;
@ -106,6 +108,8 @@ public class ConfigFileApplicationListener implements
public static final int DEFAULT_ORDER = Ordered . HIGHEST_PRECEDENCE + 10 ;
public static final int DEFAULT_ORDER = Ordered . HIGHEST_PRECEDENCE + 10 ;
private static Log logger = LogFactory . getLog ( ConfigFileApplicationListener . class ) ;
private String searchLocations ;
private String searchLocations ;
private String names ;
private String names ;
@ -114,6 +118,8 @@ public class ConfigFileApplicationListener implements
private final ConversionService conversionService = new DefaultConversionService ( ) ;
private final ConversionService conversionService = new DefaultConversionService ( ) ;
private final List < Object > debug = new ArrayList < Object > ( ) ;
@Override
@Override
public void onApplicationEvent ( ApplicationEvent event ) {
public void onApplicationEvent ( ApplicationEvent event ) {
if ( event instanceof ApplicationEnvironmentPreparedEvent ) {
if ( event instanceof ApplicationEnvironmentPreparedEvent ) {
@ -140,9 +146,21 @@ public class ConfigFileApplicationListener implements
}
}
private void onApplicationPreparedEvent ( ApplicationPreparedEvent event ) {
private void onApplicationPreparedEvent ( ApplicationPreparedEvent event ) {
logDebugMessages ( ) ;
addPostProcessors ( event . getApplicationContext ( ) ) ;
addPostProcessors ( event . getApplicationContext ( ) ) ;
}
}
private void logDebugMessages ( ) {
// Debug logging is deferred because the Logging initialization might not have
// run at the time that config file decisions are taken
if ( logger . isDebugEnabled ( ) ) {
for ( Object message : this . debug ) {
logger . debug ( message ) ;
}
}
this . debug . clear ( ) ;
}
/ * *
/ * *
* Add config file property sources to the specified environment .
* Add config file property sources to the specified environment .
* @param environment the environment to add source to
* @param environment the environment to add source to
@ -270,6 +288,8 @@ public class ConfigFileApplicationListener implements
private boolean activatedProfiles ;
private boolean activatedProfiles ;
private final List < Object > debug = ConfigFileApplicationListener . this . debug ;
public Loader ( ConfigurableEnvironment environment , ResourceLoader resourceLoader ) {
public Loader ( ConfigurableEnvironment environment , ResourceLoader resourceLoader ) {
this . environment = environment ;
this . environment = environment ;
this . resourceLoader = resourceLoader = = null ? new DefaultResourceLoader ( )
this . resourceLoader = resourceLoader = = null ? new DefaultResourceLoader ( )
@ -280,7 +300,6 @@ public class ConfigFileApplicationListener implements
this . propertiesLoader = new PropertySourcesLoader ( ) ;
this . propertiesLoader = new PropertySourcesLoader ( ) ;
this . profiles = Collections . asLifoQueue ( new LinkedList < String > ( ) ) ;
this . profiles = Collections . asLifoQueue ( new LinkedList < String > ( ) ) ;
this . activatedProfiles = false ;
this . activatedProfiles = false ;
if ( this . environment . containsProperty ( ACTIVE_PROFILES_PROPERTY ) ) {
if ( this . environment . containsProperty ( ACTIVE_PROFILES_PROPERTY ) ) {
// Any pre-existing active profiles set via property sources (e.g. System
// Any pre-existing active profiles set via property sources (e.g. System
// properties) take precedence over those added in config files.
// properties) take precedence over those added in config files.
@ -354,29 +373,46 @@ public class ConfigFileApplicationListener implements
private PropertySource < ? > loadIntoGroup ( String identifier , String location ,
private PropertySource < ? > loadIntoGroup ( String identifier , String location ,
String profile ) throws IOException {
String profile ) throws IOException {
Resource resource = this . resourceLoader . getResource ( location ) ;
Resource resource = this . resourceLoader . getResource ( location ) ;
PropertySource < ? > propertySource = null ;
if ( resource ! = null ) {
if ( resource ! = null ) {
String name = "applicationConfig: [" + location + "]" ;
String name = "applicationConfig: [" + location + "]" ;
String group = "applicationConfig: [" + identifier + "]" ;
String group = "applicationConfig: [" + identifier + "]" ;
PropertySource< ? > propertySource = this . propertiesLoader . load ( resource ,
propertySource = this . propertiesLoader . load ( resource , group , name ,
group, name , profile) ;
profile) ;
if ( propertySource ! = null ) {
if ( propertySource ! = null ) {
maybeActivateProfiles ( propertySource
maybeActivateProfiles ( propertySource
. getProperty ( ACTIVE_PROFILES_PROPERTY ) ) ;
. getProperty ( ACTIVE_PROFILES_PROPERTY ) ) ;
addIncludeProfiles ( propertySource
addIncludeProfiles ( propertySource
. getProperty ( INCLUDE_PROFILES_PROPERTY ) ) ;
. getProperty ( INCLUDE_PROFILES_PROPERTY ) ) ;
}
}
return propertySource ;
}
}
return null ;
StringBuilder msg = new StringBuilder ( ) ;
msg . append ( propertySource = = null ? "Skipped " : "Loaded " ) ;
msg . append ( "config file " ) ;
msg . append ( "'" + location + "' " ) ;
msg . append ( StringUtils . hasLength ( profile ) ? "for profile " : "" ) ;
msg . append ( resource = = null | | ! resource . exists ( ) ? "resource not found" : "" ) ;
this . debug . add ( msg ) ;
return propertySource ;
}
}
private void maybeActivateProfiles ( Object value ) {
private void maybeActivateProfiles ( Object value ) {
if ( ! this . activatedProfiles = = true ) {
if ( this . activatedProfiles ) {
Set < String > profiles = getProfilesForValue ( value ) ;
if ( value ! = null ) {
activateProfiles ( profiles ) ;
this . debug . add ( "Profiles already activated, '" + value
if ( profiles . size ( ) > 0 ) {
+ "' will not be applied" ) ;
this . activatedProfiles = true ;
}
}
return ;
}
Set < String > profiles = getProfilesForValue ( value ) ;
activateProfiles ( profiles ) ;
if ( profiles . size ( ) > 0 ) {
this . debug . add ( "Activated profiles "
+ StringUtils . collectionToCommaDelimitedString ( profiles ) ) ;
this . activatedProfiles = true ;
}
}
}
}