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

时间:2017-04-21 19:52:07

标签: java spring

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

简单的示例代码就像这样

@Component
class A implement B{
}

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

除非我改变,否则上面的代码无效     @DependsOn("B")@DependsOn("A")

3 个答案:

答案 0 :(得分:2)

一般情况下DependsOn永远不应该被使用。如果你需要它,你可能做错了什么,或者你有一个极端的角落案例。我从2006年开始使用Spring,但还没有使用它。

JavaDoc说

  

在bean的情况下很少使用      没有明确依赖于另一个通过属性或构造函数参数      而是取决于另一个bean的初始化的副作用。

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

答案 1 :(得分:0)

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

@Component
class A implement B {
}

@Component
class C {
    private final B b;

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

答案 2 :(得分:0)

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