Allow other delimiters in profile XML attribute
Previously, only commas could delimit <beans profile="p1,p2"/>. Now, as with <bean alias="..."/>, the profile attribute allows for delimiting by comma, space and/or semicolon. BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS has been added as a constant to reflect the fact this set of delimiters is used in multiple locations throughout the framework. BDPD.BEAN_NAME_DELIMITERS now refers to the above and has been has been preserved but deprecated for backward compat (though use outside the framework is unlikely). Changes originally based on user comment at http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/comment-page-1/#comment-184455 Issue: SPR-8033 git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4081 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
parent
d0a22cd2ce
commit
39c43de27d
|
|
@ -87,7 +87,10 @@ public class BeanDefinitionParserDelegate {
|
|||
|
||||
public static final String BEANS_NAMESPACE_URI = "http://www.springframework.org/schema/beans";
|
||||
|
||||
public static final String BEAN_NAME_DELIMITERS = ",; ";
|
||||
public static final String MULTI_VALUE_ATTRIBUTE_DELIMITERS = ",; ";
|
||||
|
||||
/** @deprecated as of Spring 3.1 in favor of {@link #MULTI_VALUE_ATTRIBUTE_DELIMITERS} */
|
||||
public static final String BEAN_NAME_DELIMITERS = MULTI_VALUE_ATTRIBUTE_DELIMITERS;
|
||||
|
||||
/**
|
||||
* Value of a T/F attribute that represents true.
|
||||
|
|
@ -451,7 +454,7 @@ public class BeanDefinitionParserDelegate {
|
|||
|
||||
List<String> aliases = new ArrayList<String>();
|
||||
if (StringUtils.hasLength(nameAttr)) {
|
||||
String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, BEAN_NAME_DELIMITERS);
|
||||
String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);
|
||||
aliases.addAll(Arrays.asList(nameArr));
|
||||
}
|
||||
|
||||
|
|
@ -624,7 +627,7 @@ public class BeanDefinitionParserDelegate {
|
|||
|
||||
if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) {
|
||||
String dependsOn = ele.getAttribute(DEPENDS_ON_ATTRIBUTE);
|
||||
bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, BEAN_NAME_DELIMITERS));
|
||||
bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS));
|
||||
}
|
||||
|
||||
String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
|
||||
|
|
|
|||
|
|
@ -16,9 +16,6 @@
|
|||
|
||||
package org.springframework.beans.factory.xml;
|
||||
|
||||
import static org.springframework.util.StringUtils.commaDelimitedListToStringArray;
|
||||
import static org.springframework.util.StringUtils.trimAllWhitespace;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.LinkedHashSet;
|
||||
|
|
@ -124,7 +121,7 @@ public class DefaultBeanDefinitionDocumentReader implements BeanDefinitionDocume
|
|||
String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
|
||||
if (StringUtils.hasText(profileSpec)) {
|
||||
Assert.state(this.environment != null, "environment property must not be null");
|
||||
String[] specifiedProfiles = commaDelimitedListToStringArray(trimAllWhitespace(profileSpec));
|
||||
String[] specifiedProfiles = StringUtils.tokenizeToStringArray(profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
|
||||
if (!this.environment.acceptsProfiles(specifiedProfiles)) {
|
||||
// TODO SPR-7508: log that this bean is being rejected on profile mismatch
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -82,11 +82,12 @@
|
|||
<xsd:attribute name="profile" use="optional" type="xsd:string">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation><![CDATA[
|
||||
The set of profiles for which this <beans> element may be parsed. May be a comma-delimited
|
||||
list in the case of multiple profiles. If one or more of the specified profiles are active at time
|
||||
of parsing, the <beans> element will be parsed, and all of its <bean> elements registered,
|
||||
<import> elements followed, etc. If none of the specified profiles are active at time of parsing,
|
||||
then the entire element and its contents will be ignored.
|
||||
The set of profiles for which this <beans> element may be parsed. Multiple profiles can be
|
||||
separated by any number of spaces, commas, or semi-colons (or indeed any mixture of the three).
|
||||
If one or more of the specified profiles are active at time of parsing, the <beans> element
|
||||
will be parsed, and all of its <bean> elements registered, <import> elements followed,
|
||||
etc. If none of the specified profiles are active at time of parsing, then the entire element
|
||||
and its contents will be ignored.
|
||||
|
||||
Profiles are activated in one of two ways:
|
||||
Programmatic:
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ public class ProfileXmlBeanDefinitionTests {
|
|||
private static final String DEV_ELIGIBLE_XML = "ProfileXmlBeanDefinitionTests-devProfile.xml";
|
||||
private static final String ALL_ELIGIBLE_XML = "ProfileXmlBeanDefinitionTests-noProfile.xml";
|
||||
private static final String MULTI_ELIGIBLE_XML = "ProfileXmlBeanDefinitionTests-multiProfile.xml";
|
||||
private static final String MULTI_ELIGIBLE_SPACE_DELIMITED_XML = "ProfileXmlBeanDefinitionTests-spaceDelimitedProfile.xml";
|
||||
private static final String UNKOWN_ELIGIBLE_XML = "ProfileXmlBeanDefinitionTests-unknownProfile.xml";
|
||||
private static final String DEFAULT_ELIGIBLE_XML = "ProfileXmlBeanDefinitionTests-defaultProfile.xml";
|
||||
private static final String CUSTOM_DEFAULT_ELIGIBLE_XML = "ProfileXmlBeanDefinitionTests-customDefaultProfile.xml";
|
||||
|
|
@ -81,6 +82,13 @@ public class ProfileXmlBeanDefinitionTests {
|
|||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_XML, PROD_ACTIVE), containsTargetBean());
|
||||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_XML, MULTI_ACTIVE), containsTargetBean());
|
||||
|
||||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_SPACE_DELIMITED_XML, NONE_ACTIVE), not(containsTargetBean()));
|
||||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_SPACE_DELIMITED_XML, NULL_ACTIVE), not(containsTargetBean()));
|
||||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_SPACE_DELIMITED_XML, UNKNOWN_ACTIVE), not(containsTargetBean()));
|
||||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_SPACE_DELIMITED_XML, DEV_ACTIVE), containsTargetBean());
|
||||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_SPACE_DELIMITED_XML, PROD_ACTIVE), containsTargetBean());
|
||||
assertThat(beanFactoryFor(MULTI_ELIGIBLE_SPACE_DELIMITED_XML, MULTI_ACTIVE), containsTargetBean());
|
||||
|
||||
assertThat(beanFactoryFor(UNKOWN_ELIGIBLE_XML, MULTI_ACTIVE), not(containsTargetBean()));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
|
||||
profile="dev prod">
|
||||
|
||||
<bean id="foo" class="java.lang.String"/>
|
||||
</beans>
|
||||
Loading…
Reference in New Issue