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:
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user