【问题标题】:Spring 3.2 annotation autowiring with multiple constructors带有多个构造函数的 Spring 3.2 注释自动装配
【发布时间】:2014-09-03 14:16:03
【问题描述】:

春季文档:

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

如果我有一个自动装配的构造函数,一切都很好。如果我有两个或更多自动装配,但 required=false 带注释的构造函数,一切都很好。但是,如果我以某种方式混合它们,例如有一个或多个 required=false 构造函数自动装配注释,并且恰好有一个 required=true,则会引发异常。

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

这是预期的行为吗?我是否缺少有关 Spring 依赖注入如何工作的信息?如果这是正常的,为什么这是 Spring 的问题,为什么它不能处理这样的设置?

【问题讨论】:

  • 你能发布你的源代码吗?
  • 您始终可以退回到对字段进行注释,而不是构造函数将字段注释标记为 required=false 并延迟加载变量。 HTH
  • @Component public class Account { private Card card; private AtmCard card1; @Autowired(required=true) public Account(Card card) { System.out.println(" in constructor"); this.card = card; } @Autowired(required=false) public Account(Card card, AtmCard card1) { System.out.println(" in setterr"); this.card = card; this.card1 = card1; } } 错误 Error creating bean with name 'account': Invalid autowire-marked constructor: public Account(Card,AtmCard). Found constructor with 'required' Autowired annotation already: public Account(Card) 请帮助解决这个问题

标签: spring constructor autowired required


【解决方案1】:

春季 5 文档:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @Component public class Account { private Card card; private AtmCard card1; @Autowired(required=true) public Account(Card card) { System.out.println(" in constructor"); this.card = card; } @Autowired(required=false) public Account(Card card, AtmCard card1) { System.out.println(" in setterr"); this.card = card; this.card1 = card1; } } 错误Error creating bean with name 'account': Invalid autowire-marked constructor: public Account(Card,AtmCard). Found constructor with 'required' Autowired annotation already: public Account(Card) 请帮忙
    • @mike_m 那么只有自动装配的构造函数与需要自动装配的有什么区别?
    • @Maxrunner 参数 required 的默认值为 true。所以 @Autowired@Autowired(required=true) 是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2018-05-08
    • 2016-09-04
    相关资源
    最近更新 更多