从多个配置文件创建的ClassPathXmlApplicationContext会覆盖具有相同类型和不同ID的bean

时间:2014-10-28 12:18:04

标签: spring applicationcontext

我有多个spring config xml文件,用于创建一个全局上下文,如下所示:

<?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.xsd">
  <bean class="org.springframework.context.support.ClassPathXmlApplicationContext" id="global.context">
    <constructor-arg index="0">
      <list>
        <value>classpath:config/common/main-springconfig.xml</value>
        <value>classpath:config/me/main-springconfig.xml</value>
      </list>
    </constructor-arg>
  </bean>
</beans>

我创建这样的上下文:

private static final String springContext = "global.context";
private static final String beanRefContext = "classpath*:global-config.xml";
private ConfigurableApplicationContext springApplicationContext;

ClassPathXmlServiceLocator()
{
    BeanFactoryLocator beanFactoryLocator = ContextSingletonBeanFactoryLocator.getInstance(beanRefContext);
    springApplicationContext = (ConfigurableApplicationContext) beanFactoryLocator.
            useBeanFactory(springContext).getFactory();
}

问题是每个配置都具有相同类型的bean的defenition:some.package.BeanType,但是当完全实例化上下文时,只有一个该类型的bean可用。

ClassPathXmlApplicationContext中有一个注释:javadoc:

  

如果有多个配置位置,以后的bean定义将覆盖先前加载的文件中定义的bean定义。这可以用来通过额外的XML文件故意覆盖某些bean定义。

但这是否意味着即使在不同的配置文件中定义的具有不同ID的bean也会被覆盖?我怎样才能克服这个问题?

1 个答案:

答案 0 :(得分:0)

最后,我找到了问题的根本原因。 Spring一直在正常工作。问题出在第三方类(所谓的:some.package.BeanType)。