是否可以将上下文注入另一个上下文?

时间:2011-05-13 06:54:18

标签: java xml spring inheritance applicationcontext

也许问题不是那么明确,但举个例子,我想我会清除它。在我的项目中,我有两种测试:集成测试和场景测试。他们都需要一个数据源(使用自定义的propertyplaceholder)。

在集成测试用例的上下文中,仅定义数据源和占位符,如下所示:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

<bean id="propertyResolver" class="com.cegeka.bibliothouris.test.MultiThreadedPropertyResolver">
    <property name="location"><value>classpath:testContext.properties</value></property>
</bean>

在我的方案测试用例上下文中,我也需要这些对象(以及其他一些东西),但我只是想在'我的场景上下文中创建一个集成上下文,所以某种继承。

我已经在我的方案测试用例中使用classPathApplicationContext进行了尝试(一次使用lazy-init为true),如下所示:

<bean class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>classpath:overridingTestContext.xml</value>
        </list>
    </constructor-arg>
</bean>

但他没有在场景上下文中创建dataSource。这是一个很难谷歌的问题,这就是我在这里问的原因。我希望有人有解决方案。

1 个答案:

答案 0 :(得分:2)

Spring可以结合多个appicationcontexts,并通过只允许一个具有相同id的bean来提供类似继承的模型。如果两个bean共享相同的id,后者将覆盖前者。

因此,您只需使用例如

按正确的顺序导入所需的配置
<import resource="context.xml" />

然而,行为确实取决于的价值  setAllowBeanDefinitionOverriding,默认为true

这会回答你的问题吗?