当我写一些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")
,否则上面的代码无法工作
3条答案
按热度按时间jc3wubiy1#
**一般来说
DependsOn
不应该使用。**如果你需要它,你可能做错了什么,或者你有一个极端的情况。我从2006年开始使用Spring,现在还不需要它。JavaDoc表示
不常用于bean不通过属性或构造函数参数显式依赖于另一个bean的情况,而是依赖于另一个bean初始化的副作用。
这基本上意味着只有当你或其他人写了糟糕的代码时才使用
DependsOn
。例如,一个bean构造函数在磁盘上创建了另一个bean构造时需要的资源。Springs IoC容器和声明性连接允许你控制bean之间的依赖关系。但是 * 在*极其罕见的情况下,其中一些遗留代码具有未声明的依赖项DependsOn
可以让您控制不相关的spring beans的构造顺序。sy5wg1nm2#
对于简单的自动装配,在字段或构造函数上使用
@Autowired
。从Spring 4.3开始,在使用构造函数注入时可以省略@Autowired
。bvn4nwqk3#
我在尝试使用depends on时也遇到了同样的问题,但经过研究,我发现最好的方法是删除C类构造函数中B的依赖关系,并在一个由
@PostConstruct
注解的方法init
中使用此逻辑,因此在初始化所有构造函数后,此方法将被执行。希望我的答案对您有所帮助。