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

wztqucjr  于 2023-03-28  发布在  Spring
关注(0)|答案(3)|浏览(102)

当我写一些spring代码时,我使用spring 4和class和annotation-config。我已经声明了一个bean实现了一个接口作为组件。我试图让另一个bean依赖于它的接口时间。但它不起作用,因为spring抛出了一个错误,没有找到那个名字的bean。我想这可能是因为depends on只适用于具体的class auto wire,但是我不知道为什么它以这种方式设置?有人能解释为什么依赖于注解不允许类型自动连接到接口吗?
简单的示例代码如下所示

@Component
class A implement B{
}

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

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

jc3wubiy

jc3wubiy1#

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

JavaDoc表示
不常用于bean不通过属性或构造函数参数显式依赖于另一个bean的情况,而是依赖于另一个bean初始化的副作用。
这基本上意味着只有当你或其他人写了糟糕的代码时才使用DependsOn。例如,一个bean构造函数在磁盘上创建了另一个bean构造时需要的资源。Springs IoC容器和声明性连接允许你控制bean之间的依赖关系。但是 * 在
*极其罕见的情况下
,其中一些遗留代码具有未声明的依赖项DependsOn可以让您控制不相关的spring beans的构造顺序。

sy5wg1nm

sy5wg1nm2#

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

@Component
class A implement B {
}

@Component
class C {
    private final B b;

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

bvn4nwqk3#

我在尝试使用depends on时也遇到了同样的问题,但经过研究,我发现最好的方法是删除C类构造函数中B的依赖关系,并在一个由@PostConstruct注解的方法init中使用此逻辑,因此在初始化所有构造函数后,此方法将被执行。希望我的答案对您有所帮助。

相关问题