Spring每次看到导入时都会再次加载相同的应用程序上下文吗?

时间:2016-02-16 23:13:30

标签: java spring spring-bean

我正在尝试重写bean定义并发现以下内容,这与预期的实验略有不同。

我有两个应用上下文文件。

App上下文1:

<bean id="my" class="java.lang.String">
    <constructor-arg value="applicationContext-xml_1.xml" />
</bean>

应用环境2:

<bean id="my" class="java.lang.String">
    <constructor-arg value="applicationContext-xml_2.xml" />
</bean>

<import resource="applicationContext-xml_1.xml"/>

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext-xml_1.xml", "classpath:applicationContext-xml_2.xml"})
public class SpringOverridesTest {
   //...
}

我希望Spring在xml_2中遇到 import xml_1 时再次加载xml_1。但事实并非如此。这是日志的修剪版本:

[XmlBeanDefinitionReader.loadBeanDefinitions()] - Loading XML bean definitions from class path resource [applicationContext-xml_1.xml]
[XmlBeanDefinitionReader.loadBeanDefinitions()] - Loading XML bean definitions from class path resource [applicationContext-xml_2.xml]
[DefaultListableBeanFactory.registerBeanDefinition()] - Overriding bean definition for bean 'my': replacing [... defined in class path resource [applicationContext-xml_1.xml]] with [... defined in class path resource [applicationContext-xml_2.xml]]
[XmlBeanDefinitionReader.loadBeanDefinitions()] - Loading XML bean definitions from class path resource [applicationContext-xml_1.xml]
[DefaultListableBeanFactory.registerBeanDefinition()] - Overriding bean definition for bean 'my': replacing [... defined in class path resource [applicationContext-xml_2.xml]] with [... defined in class path resource [applicationContext-xml_1.xml]]

问题:看到Spring加载xml两次令人惊讶。有人可以解释一下这个动机吗?

1 个答案:

答案 0 :(得分:1)

一开始你加载: applicationContext-xml_1.xml因为你做了 @ContextConfiguration({"classpath:applicationContext-xml_1.xml")使用声明的bean加载上下文并实例化它们。

然后加载 通过应用程序上下文xml 2中的第二个配置。

@ContextConfiguration({"classpath:applicationContext-xml_1.xml", "classpath:applicationContext-xml_2.xml"})

但是如果你注意到具有相同id的bean是在之前加载的覆盖,在这种情况下,我从应用程序上下文1覆盖了我的应用程序上下文xml 2。

<bean id="my" class="java.lang.String">
    <constructor-arg value="applicationContext-xml_2.xml" />
</bean>

然后,如果您注意到再次加载应用程序上下文1:

<import resource="applicationContext-xml_1.xml"/>

在应用程序上下文中导入资源用于在xml文件之间分隔逻辑。

通过导入appContext1再次执行此加载,您可以从appcontext1覆盖bean with bean。