当前位置: 首页 > 知识库问答 >
问题:

Spring 3.2带多个构造函数的注释自动关联

干高歌
2023-03-14

Spring文档:

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

如果我有一个自动连接的构造函数,一切都很好。如果我有两个或更多自动连接的构造函数,但required=false注释的构造函数,那么一切都很好。但如果我以某种方式将它们混合在一起,这样就有一个或多个required=false构造函数自动连接注释,而只有一个required=true,那么它会抛出一个异常。

组织。springframework。豆。工厂BeanCreationException:自动连线标记的构造函数无效:public annotationconfig。SomeBean(annotationconfig.AnotherBean)。找到另一个具有“必需”自动连线批注的构造函数:public annotationconfig。SomeBean(annotationconfig.AnotherBean,annotationconfig.AnotherBean[]))

这是预期的行为吗?我是不是错过了一些关于Spring依赖注入的工作原理?如果这是正常的,为什么这是Spring的问题,为什么它不能处理这样的设置?

共有2个答案

米飞龙
2023-03-14

Spring 5文档:

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

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

施锋
2023-03-14

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

它们不会自动连接,因为其中一个构造函数已经是必需的,必须调用。仍然可以在不使用自动连线机制的情况下调用它们,但在这种情况下,@Autowired(required=false)注释是不必要的。

 类似资料:
  • 有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn

  • 我有一个有两个构造函数的类。我正在尝试使用 guice 工厂创建此类的实例。如果未传递任何参数,则应调用默认构造函数。如果传递了参数,则应调用带参数的构造函数。但目前即使我将参数传递给工厂方法,仍然会调用默认构造函数。带参数的构造函数根本不被调用。下面是我的工厂类。 以下是我尝试注入的构造函数。 下面是我在抽象模块实现类中的模块绑定。 下面是我如何调用构造函数。 我在这里做错了什么?任何帮助都将不

  • 这就是我的目标: 这是我的Aspect类: 如何为构造函数对象创建切入点?

  • Spring文档说: 每个类只能标记一个带注释的构造函数,但是可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选的,Spring使用最贪婪的构造函数,其依赖关系可以得到满足——也就是说,具有最多参数的构造函数。构造函数解析算法与具有重载构造函数的非注释类相同,只是将候选对象缩小为注释构造函数。 我测试了它,当我有另一个由 错误: 组织。springframework。豆。工厂BeanC

  • 我对字段访问JPA注释的POJO非常困惑。 当字段是私有的时,您应该如何设置(或获取)它们?我更喜欢使用字段注释(我没有使用getter/setter方法),但我对它的工作方式有点困惑。

  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。