Spring docs:
每个类只能标记一个带注释的构造函数,但可以注释多个非必需的构造函数。
如果我有一个自动装配的构造函数,一切都很好。如果我有两个或更多autowired,但required = false注释构造函数,一切都很好。但是如果我以某种方式混合它们,以便有一个或多个required = false构造函数自动装配注释,并且只有一个带有required = true,则抛出异常。
org.springframework.beans.factory.BeanCreationException:无效的自动标记构造函数:public annotationconfig.SomeBean(annotationconfig.AnotherBean)。找到了另一个需要'的构造函数。自动注释:public annotationconfig.SomeBean(annotationconfig.AnotherBean,annotationconfig.AnotherBean [])
这是预期的行为吗?我错过了一些关于Spring依赖注入如何工作的东西?如果这是正常的,为什么这对Spring来说是一个问题,为什么它不能处理这样的设置呢?
答案 0 :(得分:4)
我认为这种行为的原因是,如果其中一个构造函数具有@Autowired(required=true)
,那么它必须被调用(因为它是必需的)并且因为每个对象实例化只能调用一个构造函数然后什么是否有其他构造函数 @Autowired(required=false)
?
他们无论如何都不会被自动装配,因为其中一个构造函数已经被要求并且必须被调用。仍然可以在不使用自动装配机制的情况下调用它们,但在这种情况下,@Autowired(required=false)
注释是不必要的。
答案 1 :(得分:0)
Spring 5文档:
每个类只能标记一个带注释的构造函数, 但是可以注释多个非必需的构造函数。在这种情况下, 每个都被认为是候选人,而Spring使用的是最贪婪的 可以满足依赖关系的构造函数,即 具有最多参数的构造函数。
尽管需要一个构造函数,但如果解决了依赖关系,spring可能会使用其他构造函数;