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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 3.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的问题,为什么它不能处理这样的设置?

答案

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

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

另一答案

Spring 5文档:

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

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

以上是关于Spring 3.2注释自动装配多个构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot,无法自动装配类。未找到默认构造函数引发异常

Spring Boot 构造函数自动装配异常

Spring

使用构造函数自动装配泛型类型 [Spring 4.2.5]

Spring入门

在Spring中通过构造自动装配--constructor