gpt4 book ai didi

spring - 将 xml 定义中的其他 bean 添加到已在运行时初始化的应用程序上下文中

转载 作者:行者123 更新时间:2023-12-02 11:26:21 25 4
gpt4 key购买 nike

正如您在下面的代码中看到的,我想加载两个xml,A.xmlB.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com