为什么 Spring DependsOn 注释不能用于自动连接接口

Liy*_*uan 2 java spring

当我正在编写一些 spring 代码时,我将 spring 4 与 class 和 annotation-config 一起使用。我已经声明了一个 bean 将一个接口实现为一个组件。我正在尝试使另一个 bean 依赖于它的接口时间。但它不起作用,因为 spring 抛出一个错误,没有在该名称中找到 bean。我认为这可能是因为取决于仅适用于具体类自动线,但我不知道为什么要这样设置?有没有人可以解释为什么依赖注释不允许类型自动连接到接口?

简单的示例代码是这样的

@Component
class A implement B{
}

@Component
@DependsOn("B")
class C {
}
Run Code Online (Sandbox Code Playgroud)

除非我更改@DependsOn("B")为,否则上面的代码无法工作 @DependsOn("A")

Kla*_*aek 5

一般DependsOn不应使用。如果你需要它,你可能做错了什么,或者你有一个极端的极端情况。我从 2006 年开始使用 Spring,现在还不需要它。

JavaDoc 说

在一个 bean不通过属性或构造函数参数显式依赖另一个bean , 而是依赖另一个 bean 初始化的副作用的情况下,很少 使用。

这基本上意味着只有DependsOn在您或其他人编写了错误代码时才使用。例如,一个 beans 构造函数在磁盘上创建另一个 bean 在构造时需要的资源。Springs IoC 容器和声明式接线让您可以控制 bean 之间的依赖关系,但在极少数情况下,某些遗留代码具有未声明的依赖关系DependsOn,您可以控制构造无关 spring bean 的顺序。

  • 遗留代码并不是需要 DependsOn 的良好 Spring 代码的唯一示例。考虑一个使用 jersey ioc 和 spring 的 http 服务组件。如果您不希望应用程序在某些数据获取组件完成其初始化和数据收集过程之前“开始营业”,那么您可以在 http 服务组件上使用 DependsOn 来指示它依赖于该数据获取组件。没有直接的 spring 依赖项,但您仍然需要服务器在数据准备好之前才启动。 (2认同)
  • @BennyBottema我为几个大型的基于Spring的项目构建了spring测试基础设施,但我仍然没有使用DependsOn。如果您依赖于外部资源,例如 testcontainers `JdbcDatabaseContainer`,我更喜欢将它们链接到 Spring bean,因此依赖关系是显式的。如果我需要填充外部资源,我将使用 SmartLifeCyle bean 来实现,因此 bean 实例化阶段和生命周期启动之间有明确的分离,您可以在其中与资源交互并启动后台线程。 (2认同)