当我正在编写一些弹簧代码时,我使用带有class和annotation-config的spring 4。我已经声明bean实现了一个接口作为组件。我尝试制作另一个bean依赖于它的接口时间。但它不起作用,因为spring在该名称中找不到bean时会抛出错误。我认为这可能因为仅仅依赖于具体的类汽车线,但我不知道为什么它以这种方式设置?是否有人可以解释为什么依赖于注释不允许类型自动连接到接口?
简单的示例代码就像这样
@Component
class A implement B{
}
@Component
@DependsOn("B")
class C {
}
除非我改变,否则上面的代码无效
@DependsOn("B")
至@DependsOn("A")
答案 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
来完成,因此在初始化所有构造函数之后,将执行此方法。
希望我的回答对您有所帮助。