INT-926 inner handler beans are now created with prototype scope to avoid shared singleton for multiple inheritors of same abstract parent (see tests in this commit for an example).
This commit is contained in:
@@ -65,13 +65,14 @@ public class ChainParser extends AbstractConsumerEndpointParser {
|
||||
parserContext.getReaderContext().error("child BeanDefinition must not be null", element);
|
||||
}
|
||||
else {
|
||||
String beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, parserContext.getRegistry());
|
||||
String beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, parserContext.getRegistry(), true);
|
||||
holder = new BeanDefinitionHolder(beanDefinition, beanName);
|
||||
}
|
||||
}
|
||||
if (holder == null) {
|
||||
return null;
|
||||
}
|
||||
holder.getBeanDefinition().setScope(BeanDefinition.SCOPE_PROTOTYPE);
|
||||
BeanDefinitionReaderUtils.registerBeanDefinition(holder, parserContext.getRegistry());
|
||||
return holder.getBeanName();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans:beans xmlns="http://www.springframework.org/schema/integration"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:beans="http://www.springframework.org/schema/beans"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/integration
|
||||
http://www.springframework.org/schema/integration/spring-integration.xsd">
|
||||
|
||||
<beans:bean id="abstractParent" class="org.springframework.integration.config.xml.NestedChainParserTests$ParentTestBean" abstract="true">
|
||||
<beans:property name="chain">
|
||||
<chain>
|
||||
<service-activator ref="service"/>
|
||||
</chain>
|
||||
</beans:property>
|
||||
</beans:bean>
|
||||
|
||||
<beans:bean id="concreteParent1" parent="abstractParent"/>
|
||||
|
||||
<beans:bean id="concreteParent2" parent="abstractParent"/>
|
||||
|
||||
<beans:bean id="service" class="org.springframework.integration.config.xml.NestedChainParserTests$ChildTestBean"/>
|
||||
|
||||
</beans:beans>
|
||||
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright 2002-2009 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.integration.config.xml;
|
||||
|
||||
import static org.junit.Assert.assertNotSame;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.integration.handler.MessageHandlerChain;
|
||||
import org.springframework.integration.message.MessageHandler;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
@ContextConfiguration
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
public class NestedChainParserTests {
|
||||
|
||||
@Autowired
|
||||
private ApplicationContext context;
|
||||
|
||||
@Test
|
||||
public void chainsAreNotSame() {
|
||||
ParentTestBean bean1 = context.getBean("concreteParent1", ParentTestBean.class);
|
||||
ParentTestBean bean2 = context.getBean("concreteParent2", ParentTestBean.class);
|
||||
assertNotSame(bean1, bean2);
|
||||
assertNotSame(bean1.chain, bean2.chain);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void handlersAreNotSame() {
|
||||
ParentTestBean bean1 = context.getBean("concreteParent1", ParentTestBean.class);
|
||||
ParentTestBean bean2 = context.getBean("concreteParent2", ParentTestBean.class);
|
||||
List<MessageHandler> handlerList1 = (List<MessageHandler>) new DirectFieldAccessor(bean1.chain).getPropertyValue("handlers");
|
||||
List<MessageHandler> handlerList2 = (List<MessageHandler>) new DirectFieldAccessor(bean2.chain).getPropertyValue("handlers");
|
||||
MessageHandler handler1 = handlerList1.get(0);
|
||||
MessageHandler handler2 = handlerList2.get(0);
|
||||
assertNotSame(handler1, handler2);
|
||||
}
|
||||
|
||||
|
||||
static class ParentTestBean {
|
||||
|
||||
private MessageHandlerChain chain;
|
||||
|
||||
public void setChain(MessageHandlerChain chain) {
|
||||
this.chain = chain;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static class ChildTestBean {
|
||||
|
||||
public String echo(String s) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user