正如您在下面的代码中看到的,
我想加载两个xml,A.xml
和B.xml
,进入ApplicationContext
分别地。我目前正在使用父/子上下文关系。但是当我这样做时,我得到了不同的类实例 C
。
有没有办法获取类C
的实例加载时初始化 A.xml
并在B.xml
中使用相同的实例?
A.xml-->
<import resource="classpath*:c.xml" />
<bean id="testA" class="com.TestA">
<property name="testC">
<ref bean="cBean" />
</property>
</bean>
B.xml-->
<import resource="classpath*:c.xml" />
<bean id="testB" class="com.TestB">
<property name="testC">
<ref bean="cBean" />
</property>
</bean>
C.xml-->
<bean id="cBean" class="com.TestC">
</bean>
这是相关代码:
context = new ClassPathXmlApplicationContext("A.xml");
context = new ClassPathXmlApplicationContext(new String[]{B.xml}, context);
((AbstractApplicationContext) context).registerShutdownHook();
输出-->
In Test A-->com.TestC@1df177.
In Test B-->com.TestC@1ad8c79
最佳答案
A 和 B 组成一个分层上下文。也就是说,A 是一个普通上下文,其中包含 2 个 bean A 和 B,而 B 是一个子上下文,包含 2 个 bean、B 和 C 的副本,并且可以从其父上下文访问 bean。
分层上下文是一个广泛使用的功能,但您不应在子上下文中复制父上下文中的 bean。如果这样做,来自父级和子级的 bean 将为任何重复的 bean 使用不同的副本 -> 您在此处获得的内容。
如何修复:
最简单的方法是不在 B 中导入 C。这样,bean C 只位于 A 中,但由于父子关系,仍然可以从 B 访问。
B.xml-->
<bean id="testB" class="com.TestB">
<property name="testC">
<ref bean="cBean" />
</property>
</bean>
关于spring - 将 xml 定义中的其他 bean 添加到已在运行时初始化的应用程序上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38114422/