Browse Source

Polishing

pull/622/head
Juergen Hoeller 12 years ago
parent
commit
a7492fa55b
  1. 3
      spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
  2. 4
      spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java
  3. 9
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java
  4. 2
      spring-context/src/main/java/org/springframework/jndi/support/SimpleJndiBeanFactory.java
  5. 6
      spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java
  6. 49
      spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java
  7. 11
      spring-core/src/test/java/org/springframework/core/env/StandardEnvironmentTests.java

3
spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

@ -671,12 +671,15 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
if (this.logger.isDebugEnabled()) { if (this.logger.isDebugEnabled()) {
this.logger.debug("Pre-instantiating singletons in " + this); this.logger.debug("Pre-instantiating singletons in " + this);
} }
List<String> beanNames; List<String> beanNames;
synchronized (this.beanDefinitionMap) { synchronized (this.beanDefinitionMap) {
// Iterate over a copy to allow for init methods which in turn register new bean definitions. // Iterate over a copy to allow for init methods which in turn register new bean definitions.
// While this may not be part of the regular factory bootstrap, it does otherwise work fine. // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
beanNames = new ArrayList<String>(this.beanDefinitionNames); beanNames = new ArrayList<String>(this.beanDefinitionNames);
} }
// Trigger initialization of all non-lazy singleton beans...
for (String beanName : beanNames) { for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {

4
spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -133,7 +133,7 @@ public class StaticListableBeanFactory implements ListableBeanFactory {
public Object getBean(String name, Object... args) throws BeansException { public Object getBean(String name, Object... args) throws BeansException {
if (args != null) { if (args != null) {
throw new UnsupportedOperationException( throw new UnsupportedOperationException(
"StaticListableBeanFactory does not support explicit bean creation arguments)"); "StaticListableBeanFactory does not support explicit bean creation arguments");
} }
return getBean(name); return getBean(name);
} }

9
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

@ -113,6 +113,8 @@ class ConfigurationClassParser {
private final ComponentScanAnnotationParser componentScanParser; private final ComponentScanAnnotationParser componentScanParser;
private final ConditionEvaluator conditionEvaluator;
private final Map<ConfigurationClass, ConfigurationClass> configurationClasses = private final Map<ConfigurationClass, ConfigurationClass> configurationClasses =
new LinkedHashMap<ConfigurationClass, ConfigurationClass>(); new LinkedHashMap<ConfigurationClass, ConfigurationClass>();
@ -125,8 +127,6 @@ class ConfigurationClassParser {
private final List<DeferredImportSelectorHolder> deferredImportSelectors = new LinkedList<DeferredImportSelectorHolder>(); private final List<DeferredImportSelectorHolder> deferredImportSelectors = new LinkedList<DeferredImportSelectorHolder>();
private final ConditionEvaluator conditionEvaluator;
/** /**
* Create a new {@link ConfigurationClassParser} instance that will be used * Create a new {@link ConfigurationClassParser} instance that will be used
@ -228,7 +228,7 @@ class ConfigurationClassParser {
* multiple times as relevant sources are discovered. * multiple times as relevant sources are discovered.
* @param configClass the configuration class being build * @param configClass the configuration class being build
* @param sourceClass a source class * @param sourceClass a source class
* @return the superclass, {@code null} if none found or previously processed * @return the superclass, or {@code null} if none found or previously processed
*/ */
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException { protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
// recursively process any member (nested) classes first // recursively process any member (nested) classes first
@ -675,7 +675,7 @@ class ConfigurationClassParser {
if (this.source instanceof Class<?>) { if (this.source instanceof Class<?>) {
return (Class<?>) this.source; return (Class<?>) this.source;
} }
String className = ((MetadataReader) source).getClassMetadata().getClassName(); String className = ((MetadataReader) this.source).getClassMetadata().getClassName();
return resourceLoader.getClassLoader().loadClass(className); return resourceLoader.getClassLoader().loadClass(className);
} }
@ -695,7 +695,6 @@ class ConfigurationClassParser {
public Collection<SourceClass> getMemberClasses() throws IOException { public Collection<SourceClass> getMemberClasses() throws IOException {
Object sourceToProcess = this.source; Object sourceToProcess = this.source;
if (sourceToProcess instanceof Class<?>) { if (sourceToProcess instanceof Class<?>) {
Class<?> sourceClass = (Class<?>) sourceToProcess; Class<?> sourceClass = (Class<?>) sourceToProcess;
try { try {

2
spring-context/src/main/java/org/springframework/jndi/support/SimpleJndiBeanFactory.java

@ -134,7 +134,7 @@ public class SimpleJndiBeanFactory extends JndiLocatorSupport implements BeanFac
public Object getBean(String name, Object... args) throws BeansException { public Object getBean(String name, Object... args) throws BeansException {
if (args != null) { if (args != null) {
throw new UnsupportedOperationException( throw new UnsupportedOperationException(
"SimpleJndiBeanFactory does not support explicit bean creation arguments)"); "SimpleJndiBeanFactory does not support explicit bean creation arguments");
} }
return getBean(name); return getBean(name);
} }

6
spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java vendored

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -181,8 +181,8 @@ public abstract class AbstractPropertyResolver implements ConfigurablePropertyRe
* @see #setIgnoreUnresolvableNestedPlaceholders * @see #setIgnoreUnresolvableNestedPlaceholders
*/ */
protected String resolveNestedPlaceholders(String value) { protected String resolveNestedPlaceholders(String value) {
return this.ignoreUnresolvableNestedPlaceholders ? return (this.ignoreUnresolvableNestedPlaceholders ?
resolvePlaceholders(value) : resolveRequiredPlaceholders(value); resolvePlaceholders(value) : resolveRequiredPlaceholders(value));
} }
private PropertyPlaceholderHelper createPlaceholderHelper(boolean ignoreUnresolvablePlaceholders) { private PropertyPlaceholderHelper createPlaceholderHelper(boolean ignoreUnresolvablePlaceholders) {

49
spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -62,8 +62,8 @@ public class PropertyPlaceholderHelper {
/** /**
* Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix. * Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix.
* Unresolvable placeholders are ignored. * Unresolvable placeholders are ignored.
* @param placeholderPrefix the prefix that denotes the start of a placeholder. * @param placeholderPrefix the prefix that denotes the start of a placeholder
* @param placeholderSuffix the suffix that denotes the end of a placeholder. * @param placeholderSuffix the suffix that denotes the end of a placeholder
*/ */
public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix) { public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix) {
this(placeholderPrefix, placeholderSuffix, null, true); this(placeholderPrefix, placeholderSuffix, null, true);
@ -75,14 +75,14 @@ public class PropertyPlaceholderHelper {
* @param placeholderSuffix the suffix that denotes the end of a placeholder * @param placeholderSuffix the suffix that denotes the end of a placeholder
* @param valueSeparator the separating character between the placeholder variable * @param valueSeparator the separating character between the placeholder variable
* and the associated default value, if any * and the associated default value, if any
* @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should be ignored * @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should
* ({@code true}) or cause an exception ({@code false}). * be ignored ({@code true}) or cause an exception ({@code false})
*/ */
public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix, public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix,
String valueSeparator, boolean ignoreUnresolvablePlaceholders) { String valueSeparator, boolean ignoreUnresolvablePlaceholders) {
Assert.notNull(placeholderPrefix, "placeholderPrefix must not be null"); Assert.notNull(placeholderPrefix, "'placeholderPrefix' must not be null");
Assert.notNull(placeholderSuffix, "placeholderSuffix must not be null"); Assert.notNull(placeholderSuffix, "'placeholderSuffix' must not be null");
this.placeholderPrefix = placeholderPrefix; this.placeholderPrefix = placeholderPrefix;
this.placeholderSuffix = placeholderSuffix; this.placeholderSuffix = placeholderSuffix;
String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix); String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix);
@ -100,12 +100,12 @@ public class PropertyPlaceholderHelper {
/** /**
* Replaces all placeholders of format {@code ${name}} with the corresponding * Replaces all placeholders of format {@code ${name}} with the corresponding
* property from the supplied {@link Properties}. * property from the supplied {@link Properties}.
* @param value the value containing the placeholders to be replaced. * @param value the value containing the placeholders to be replaced
* @param properties the {@code Properties} to use for replacement. * @param properties the {@code Properties} to use for replacement
* @return the supplied value with placeholders replaced inline. * @return the supplied value with placeholders replaced inline
*/ */
public String replacePlaceholders(String value, final Properties properties) { public String replacePlaceholders(String value, final Properties properties) {
Assert.notNull(properties, "Argument 'properties' must not be null."); Assert.notNull(properties, "'properties' must not be null");
return replacePlaceholders(value, new PlaceholderResolver() { return replacePlaceholders(value, new PlaceholderResolver() {
@Override @Override
public String resolvePlaceholder(String placeholderName) { public String resolvePlaceholder(String placeholderName) {
@ -117,25 +117,25 @@ public class PropertyPlaceholderHelper {
/** /**
* Replaces all placeholders of format {@code ${name}} with the value returned * Replaces all placeholders of format {@code ${name}} with the value returned
* from the supplied {@link PlaceholderResolver}. * from the supplied {@link PlaceholderResolver}.
* @param value the value containing the placeholders to be replaced. * @param value the value containing the placeholders to be replaced
* @param placeholderResolver the {@code PlaceholderResolver} to use for replacement. * @param placeholderResolver the {@code PlaceholderResolver} to use for replacement
* @return the supplied value with placeholders replaced inline. * @return the supplied value with placeholders replaced inline
*/ */
public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) { public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) {
Assert.notNull(value, "Argument 'value' must not be null."); Assert.notNull(value, "'value' must not be null");
return parseStringValue(value, placeholderResolver, new HashSet<String>()); return parseStringValue(value, placeholderResolver, new HashSet<String>());
} }
protected String parseStringValue( protected String parseStringValue(
String strVal, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) { String strVal, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) {
StringBuilder buf = new StringBuilder(strVal); StringBuilder result = new StringBuilder(strVal);
int startIndex = strVal.indexOf(this.placeholderPrefix); int startIndex = strVal.indexOf(this.placeholderPrefix);
while (startIndex != -1) { while (startIndex != -1) {
int endIndex = findPlaceholderEndIndex(buf, startIndex); int endIndex = findPlaceholderEndIndex(result, startIndex);
if (endIndex != -1) { if (endIndex != -1) {
String placeholder = buf.substring(startIndex + this.placeholderPrefix.length(), endIndex); String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex);
String originalPlaceholder = placeholder; String originalPlaceholder = placeholder;
if (!visitedPlaceholders.add(originalPlaceholder)) { if (!visitedPlaceholders.add(originalPlaceholder)) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@ -160,15 +160,15 @@ public class PropertyPlaceholderHelper {
// Recursive invocation, parsing placeholders contained in the // Recursive invocation, parsing placeholders contained in the
// previously resolved placeholder value. // previously resolved placeholder value.
propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders); propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders);
buf.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal); result.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal);
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Resolved placeholder '" + placeholder + "'"); logger.trace("Resolved placeholder '" + placeholder + "'");
} }
startIndex = buf.indexOf(this.placeholderPrefix, startIndex + propVal.length()); startIndex = result.indexOf(this.placeholderPrefix, startIndex + propVal.length());
} }
else if (this.ignoreUnresolvablePlaceholders) { else if (this.ignoreUnresolvablePlaceholders) {
// Proceed with unprocessed value. // Proceed with unprocessed value.
startIndex = buf.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length()); startIndex = result.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length());
} }
else { else {
throw new IllegalArgumentException("Could not resolve placeholder '" + throw new IllegalArgumentException("Could not resolve placeholder '" +
@ -181,7 +181,7 @@ public class PropertyPlaceholderHelper {
} }
} }
return buf.toString(); return result.toString();
} }
private int findPlaceholderEndIndex(CharSequence buf, int startIndex) { private int findPlaceholderEndIndex(CharSequence buf, int startIndex) {
@ -211,14 +211,13 @@ public class PropertyPlaceholderHelper {
/** /**
* Strategy interface used to resolve replacement values for placeholders contained in Strings. * Strategy interface used to resolve replacement values for placeholders contained in Strings.
* @see PropertyPlaceholderHelper
*/ */
public static interface PlaceholderResolver { public static interface PlaceholderResolver {
/** /**
* Resolves the supplied placeholder name into the replacement value. * Resolve the supplied placeholder name to the replacement value.
* @param placeholderName the name of the placeholder to resolve * @param placeholderName the name of the placeholder to resolve
* @return the replacement value or {@code null} if no replacement is to be made * @return the replacement value, or {@code null} if no replacement is to be made
*/ */
String resolvePlaceholder(String placeholderName); String resolvePlaceholder(String placeholderName);
} }

11
spring-core/src/test/java/org/springframework/core/env/StandardEnvironmentTests.java vendored

@ -204,6 +204,17 @@ public class StandardEnvironmentTests {
System.getProperties().remove(DEFAULT_PROFILES_PROPERTY_NAME); System.getProperties().remove(DEFAULT_PROFILES_PROPERTY_NAME);
} }
@Test(expected=IllegalArgumentException.class)
public void defaultProfileWithCircularPlaceholder() {
System.setProperty(DEFAULT_PROFILES_PROPERTY_NAME, "${spring.profiles.default}");
try {
environment.getDefaultProfiles();
}
finally {
System.getProperties().remove(DEFAULT_PROFILES_PROPERTY_NAME);
}
}
@Test @Test
public void getActiveProfiles_systemPropertiesEmpty() { public void getActiveProfiles_systemPropertiesEmpty() {
assertThat(environment.getActiveProfiles().length, is(0)); assertThat(environment.getActiveProfiles().length, is(0));

Loading…
Cancel
Save