繁体   English   中英

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

[英]Why Spring DependsOn annotation cannot use to auto wire an interface

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

简单的示例代码是这样的

@Component
class A implement B{
}

@Component
@DependsOn("B")
class C {
}

上面的代码不能工作,除非更改@DependsOn("B")@DependsOn("A")

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

JavaDoc 说

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

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

对于简单的自动@Autowired ,在字段或构造函数上使用@Autowired Spring 4.3开始,您可以在使用构造函数注入时省略@Autowired

@Component
class A implement B {
}

@Component
class C {
    private final B b;

    public C(B b) {
        this.b = b;
    }
}

当我尝试使用依赖时我遇到了同样的问题,但是经过我的研究,我发现最好的方法是在类 C 构造函数中删除 B 的依赖,并在@PostConstruct注释的方法init使用此逻辑,因此在初始化之后将执行此方法的所有构造函数。 希望我的回答对你有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM