Merge pull request 167 from mminella/BATCH-2019

* BATCH-2019:
  BATCH-2019: Updated to support Spring 3.1 profiles with properties
This commit is contained in:
Michael Minella
2013-04-30 10:55:07 -05:00
4 changed files with 83 additions and 19 deletions

View File

@@ -35,6 +35,7 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.util.Assert;
/**
@@ -67,6 +68,7 @@ public abstract class AbstractApplicationContextFactory implements ApplicationCo
this.resource = resource;
beanFactoryPostProcessorClasses = new ArrayList<Class<? extends BeanFactoryPostProcessor>>();
beanFactoryPostProcessorClasses.add(PropertyPlaceholderConfigurer.class);
beanFactoryPostProcessorClasses.add(PropertySourcesPlaceholderConfigurer.class);
beanFactoryPostProcessorClasses.add(CustomEditorConfigurer.class);
beanPostProcessorExcludeClasses = new ArrayList<Class<?>>();
/*
@@ -200,14 +202,14 @@ public abstract class AbstractApplicationContextFactory implements ApplicationCo
beanFactory.copyConfigurationFrom(parent);
List<BeanPostProcessor> beanPostProcessors = beanFactory instanceof AbstractBeanFactory ? ((AbstractBeanFactory) beanFactory)
.getBeanPostProcessors() : new ArrayList<BeanPostProcessor>();
for (BeanPostProcessor beanPostProcessor : new ArrayList<BeanPostProcessor>(beanPostProcessors)) {
for (Class<?> cls : beanPostProcessorExcludeClasses) {
if (cls.isAssignableFrom(beanPostProcessor.getClass())) {
logger.debug("Removing bean post processor: " + beanPostProcessor + " of type " + cls);
beanPostProcessors.remove(beanPostProcessor);
for (BeanPostProcessor beanPostProcessor : new ArrayList<BeanPostProcessor>(beanPostProcessors)) {
for (Class<?> cls : beanPostProcessorExcludeClasses) {
if (cls.isAssignableFrom(beanPostProcessor.getClass())) {
logger.debug("Removing bean post processor: " + beanPostProcessor + " of type " + cls);
beanPostProcessors.remove(beanPostProcessor);
}
}
}
}
}
}
}
@@ -223,10 +225,12 @@ public abstract class AbstractApplicationContextFactory implements ApplicationCo
@Override
public boolean equals(Object obj) {
if (this == obj)
if (this == obj) {
return true;
if (obj == null)
}
if (obj == null) {
return false;
}
return toString().equals(obj.toString());
}

View File

@@ -58,10 +58,10 @@ public class GenericApplicationContextFactory extends AbstractApplicationContext
return new ResourceXmlApplicationContext(parent, (Resource) resource);
}
if (resource instanceof Class<?>) {
return new ResourceAnnotationApplicationContext(parent, (Class<?>) resource);
return new ResourceAnnotationApplicationContext(parent, resource);
}
if (resource instanceof String) {
return new ResourceAnnotationApplicationContext(parent, (String) resource);
return new ResourceAnnotationApplicationContext(parent, resource);
}
throw new IllegalArgumentException("No application context could be created for resource type: "
+ resource.getClass());
@@ -99,7 +99,7 @@ public class GenericApplicationContextFactory extends AbstractApplicationContext
GenericApplicationContextFactory.this.prepareBeanFactory(parentBeanFactory, beanFactory);
for (Class<? extends BeanFactoryPostProcessor> cls : getBeanFactoryPostProcessorClasses()) {
for (String name : parent.getBeanNamesForType(cls)) {
beanFactory.registerSingleton(name, ((BeanFactoryPostProcessor) parent.getBean(name)));
beanFactory.registerSingleton(name, (parent.getBean(name)));
}
}
}

View File

@@ -58,8 +58,8 @@ public class GenericApplicationContextFactoryTests {
getClass(), "parent-context.xml")));
ConfigurableApplicationContext context = factory.createApplicationContext();
assertEquals("test-job", context.getBeanNamesForType(Job.class)[0]);
assertEquals("bar", ((Job) context.getBean("test-job", Job.class)).getName());
assertEquals(4, ((Foo) context.getBean("foo", Foo.class)).values[1], 0.01);
assertEquals("bar", context.getBean("test-job", Job.class).getName());
assertEquals(4, context.getBean("foo", Foo.class).values[1], 0.01);
}
@Test
@@ -70,7 +70,20 @@ public class GenericApplicationContextFactoryTests {
getClass(), "parent-context.xml")));
ConfigurableApplicationContext context = factory.createApplicationContext();
assertEquals("test-job", context.getBeanNamesForType(Job.class)[0]);
assertEquals("spam", ((Job) context.getBean("test-job", Job.class)).getName());
assertEquals("spam", context.getBean("test-job", Job.class).getName());
}
@Test
public void testBeanFactoryProfileRespected() {
GenericApplicationContextFactory factory = new GenericApplicationContextFactory(
new ClassPathResource(ClassUtils.addResourcePathToPackagePath(getClass(), "profiles.xml")));
ClassPathXmlApplicationContext parentContext = new ClassPathXmlApplicationContext(ClassUtils.addResourcePathToPackagePath(
getClass(), "parent-context.xml"));
parentContext.getEnvironment().setActiveProfiles("preferred");
factory.setApplicationContext(parentContext);
ConfigurableApplicationContext context = factory.createApplicationContext();
assertEquals("test-job", context.getBeanNamesForType(Job.class)[0]);
assertEquals("spam", context.getBean("test-job", Job.class).getName());
}
@Test
@@ -84,8 +97,8 @@ public class GenericApplicationContextFactoryTests {
factory.setBeanFactoryPostProcessorClasses(classes);
ConfigurableApplicationContext context = factory.createApplicationContext();
assertEquals("test-job", context.getBeanNamesForType(Job.class)[0]);
assertEquals("${foo}", ((Job) context.getBean("test-job", Job.class)).getName());
assertEquals(4, ((Foo) context.getBean("foo", Foo.class)).values[1], 0.01);
assertEquals("${foo}", context.getBean("test-job", Job.class).getName());
assertEquals(4, context.getBean("foo", Foo.class).values[1], 0.01);
}
@Test
@@ -97,10 +110,10 @@ public class GenericApplicationContextFactoryTests {
factory.setCopyConfiguration(false);
ConfigurableApplicationContext context = factory.createApplicationContext();
assertEquals("test-job", context.getBeanNamesForType(Job.class)[0]);
assertEquals("bar", ((Job) context.getBean("test-job", Job.class)).getName());
assertEquals("bar", context.getBean("test-job", Job.class).getName());
// The CustomEditorConfigurer is a BeanFactoryPostProcessor so the
// editor gets copied anyway!
assertEquals(4, ((Foo) context.getBean("foo", Foo.class)).values[1], 0.01);
assertEquals(4, context.getBean("foo", Foo.class).values[1], 0.01);
}
@Test

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<beans profile="preferred">
<bean id="test-job" class="org.springframework.batch.core.job.JobSupport">
<property name="name" value="${bar}" />
</bean>
<context:property-placeholder order="0" properties-ref="myProperties"/>
<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="bar">spam</prop>
</props>
</property>
</bean>
</beans>
<beans profile="other">
<bean id="test-job" class="org.springframework.batch.core.job.JobSupport">
<property name="name" value="${bar}" />
</bean>
<context:property-placeholder order="0" properties-ref="myProperties"/>
<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="bar">foo</prop>
</props>
</property>
</bean>
</beans>
</beans>