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

问题描述 投票:4回答:2

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的问题,为什么它不能处理这样的设置?

spring constructor autowired required
2个回答
3
投票

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

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


0
投票

Spring 5文档:

每个类只能标记一个带注释的构造函数,但可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选者之一,Spring使用最贪婪的构造函数,其依赖性可以得到满足,即具有最多参数的构造函数。

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

© www.soinside.com 2019 - 2024. All rights reserved.