【问题标题】:Spring setter dependency injection after all beans have been created创建所有bean后的Spring setter依赖注入
【发布时间】:2012-07-24 05:26:51
【问题描述】:

我有一组使用构造函数注入创建的 Spring bean。由于(按设计)存在对其他 bean 的循环引用,因此我想在所有 bean 创建后对它们进行后处理,以注入对其他 bean 的引用。

使用 BeanPostProcessor 的初始尝试表明 BeanPostProcessor 在每个 bean 被实例化后运行,而不是等到所有 bean 都被实例化。

Spring 是否提供了一种机制,用于在创建完一组 bean 后进行后处理?

【问题讨论】:

    标签: spring post-processing


    【解决方案1】:

    以下是the documentation 关于循环依赖的说法:

    如果您主要使用构造函数注入,则可以 创建一个无法解决的循环依赖场景。

    例如:A 类需要 B 类的实例,通过 构造函数注入,而 B 类需要 A 类的实例 通过构造函数注入。如果为 A 类配置 bean 和 B 相互注入,Spring IoC 容器检测到 这个循环引用在运行时,并抛出一个 BeanCurrentlyInCreationException。

    一种可能的解决方案是将某些类的源代码编辑为 由设置器而不是构造器配置。或者,避免 构造函数注入和仅使用 setter 注入。换一种说法, 虽然不推荐,但是可以配置循环 使用 setter 注入的依赖关系。

    与典型情况(没有循环依赖)不同,循环 bean A 和 bean B 之间的依赖关系强制 bean 之一 在完全初始化之前注入另一个(一个 经典的鸡/蛋场景)。

    在这种情况下,我只会使用 setter 注入,或者首先尝试避免循环依赖。另一种解决方案是使其中一个 bean 成为 BeanFactoryAware,并在需要引用时从 bean 工厂中查找另一个 bean。

    【讨论】:

    【解决方案2】:

    如果您在 ApplicationContext 中创建 bean,ApplicationContext 会触发 ApplicationEvents 到任何已注册的 ApplicationListener 回调。其中之一应该会告诉您上下文中的所有 bean 何时通过 Spring 连接在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2012-04-25
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多