我正在尝试重写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两次令人惊讶。有人可以解释一下这个动机吗?
答案 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。