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