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

标签 spring spring-mvc dependency-injection applicationcontext

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

相关文章:

java - 类似于 spring 的 NamedParameterUtils 的工具用于常规字符串处理?

java - 错误 : org. hibernate.exception.SQLGrammarException: 无法提取 ResultSet 并且 dateAccessed 是未知列

java - Hibernate异常: saveOrUpdate is not valid without active transaction

java - 当其中一个字段不是 String 而是另一个对象时,如何使用 Spring MVC 提交表单?

java - 使用 Spring Boot 的基于名称的虚拟主机

java - java.lang.IllegalArgumentException : Not a managed type 的问题

spring - 无法在 Spring Boot 测试 1.4 中找到 SpringBootConfiguration

android - 实现 DI 时是否应该注入(inject) viewholder?

java - 在类中的所有 setter 上使用 Spring @Autowired

jquery - 内容 slider 滑动onclick菜单项?