Spring 3.2具有多个构造函数的注释自动装配

dsp*_*ynm 7 spring constructor autowired required

春季文档:

每个类仅可以将一个带注释的构造函数标记为必需,但是可以对多个非必需的构造函数进行注释。

如果我有一个自动装配的构造函数,那一切都很好。如果我有两个或多个自动装配线,但要求= false的带注释的构造函数,则一切正常。但是,如果我以某种方式混合它们,使得存在一个或多个required = false构造函数自动装配注解,而恰好一个带有required = true的注解,则会引发异常。

org.springframework.beans.factory.BeanCreationException:无效的自动连线标记的构造函数:public注解config.SomeBean(annotationconfig.AnotherBean)。找到了另一个带有“必需”自动装配注释的构造函数:public注:config.SomeBean(annotationconfig.AnotherBean,annotationconfig.AnotherBean [])

这是预期的行为吗?我是否缺少有关Spring依赖项注入工作方式的信息?如果这是正常的,那么对于Spring来说这是一个问题,为什么它不能处理这样的设置?

mik*_*e_m 6

我认为这种行为的原因是,如果其中一个构造函数具有该构造函数,@Autowired(required=true)则必须调用它(因为它是必需的),并且由于每个对象实例只能调用一个构造函数,那么与其他构造函数一起使用 又有什么意义@Autowired(required=false)呢?

无论如何,它们都不会自动接线,因为已经需要构造函数之一,并且必须调用它们。仍可以在不使用自动装配机制的情况下调用它们,但是在这种情况下@Autowired(required=false),不需要注释。


小智 5

Spring 5 文档:

每个类只能将一个带注释的构造函数标记为必需,但可以注释多个非必需的构造函数。在这种情况下,每个都被考虑在候选者中,并且Spring使用可以满足依赖关系的最贪婪的构造函数,即具有最多参数的构造函数。

虽然需要一个构造函数,但如果依赖关系得到解决,spring 可能会使用其他构造函数;