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:
Mark Fisher
2009-12-23 06:56:42 +00:00
parent b7eabf8102
commit be13958da4
3 changed files with 108 additions and 1 deletions

View File

@@ -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();
}

View File

@@ -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>

View File

@@ -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;
}
}
}