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

Spring构造函数注入抛出一个错误时,一个以上的构造函数有@自动拥有

谷梁裕
2023-03-14

Spring文档说:

每个类只能标记一个带注释的构造函数,但是可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选的,Spring使用最贪婪的构造函数,其依赖关系可以得到满足——也就是说,具有最多参数的构造函数。构造函数解析算法与具有重载构造函数的非注释类相同,只是将候选对象缩小为注释构造函数。

测试了它,当我有另一个由@Autowired

package com.example.demo.constructorinjection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ConstructorInjectComponent {   

private InjectionServiceOne injectionServiceOne;

private InjectionServiceTwo injectionServiceTwo;

@Autowired(required = true)
public constructorInjectComponent(InjectionServiceOne injectionServiceOne,
        InjectionServiceTwo injectionServiceTwo) {
    this.injectionServiceOne = injectionServiceOne;
    this.injectionServiceTwo = injectionServiceTwo;
}

@Autowired(required = false)
public constructorInjectComponent(InjectionServiceTwo injectionServiceTwo) {
    this.injectionServiceTwo = injectionServiceTwo;
}

@Autowired(required = false)
public constructorInjectComponent(InjectionServiceOne injectionServiceOne) {
    this.injectionServiceOne = injectionServiceOne;
}

@Scheduled(fixedRate=1000L)
public void allFieldsConstructorInjectionTest() {
    System.err.println("constructorInjection " + injectionServiceOne.method() + " " + injectionServiceTwo.method());
}
}

错误:

组织。springframework。豆。工厂BeanCreationException:创建名为“constructorInjectComponent”的bean时出错:自动连线标记的构造函数无效:public com。实例演示。构造注射。constructorInjectComponent(com.example.demo.constructorinjection.InjectionServiceOne)。已找到具有“必需”自动连线批注的构造函数:public com。实例演示。构造注射。constructorInjectComponent(com.example.demo.constructorinjection.InjectionServiceOne,com.example.demo.constructorinjection.InjectionServiceWO)位于org。springframework。豆。工厂注释。AutowiredNotationBeanPostProcessor。determineCandidateConstructors(autowiredNotationBeanPostProcessor.java:314)~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]位于org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。DeterminiteConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1269)~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]

问题:

为什么不能有多个构造函数标记为@Autowired?Spring文档明确指出,我可以有多个构造函数标记为@Autowired

共有2个答案

訾稳
2023-03-14

我做了一些测试,这是我发现的。

只有一个构造函数可以被标记为@autowed(缺省情况下需要=true)。就这样。无论需要的值是多少,都不能用@autowed标记其他构造函数。但是多个构造函数可以用@autowed标记,但是它们都必须有必需=false。

查看我提出这个问题的页面。这一页我提出了改善留档的要求。

夹谷腾
2023-03-14

@AutowiredAutowiredNotationBeanPostProcessor处理,其javadoc对该行为有更好的描述:

任何给定bean类中只有一个构造函数(最多)可以声明此注释,并将“required”参数设置为true,这表示当用作Springbean时要自动连接的构造函数。

此语句讨论了'required'=true时的情况。

因此,如果'必需'=true,则只有一个构造函数(最大值)可以声明@autowed

如果多个非必需的构造函数声明注释,它们将被视为自动连接的候选。将选择具有最多依赖项的构造函数,这些依赖项可以通过匹配Spring容器中的bean来满足。

此语句表示另一种情况(即'required'=false)。

因此,如果'required'=false,它允许有多个构造函数。

您可以在for循环的源代码中看到这种检查逻辑,这些代码编写得很好,很容易理解。

 类似资料:
  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 当异常在构造函数中被抛出时,其中创建了多个对象,必须做些什么来清理内存。例如。 我的直觉是,将每个对new的调用放在一个单独的try-catch组中,并删除之前为其调用了,但这太冗长的所有对象(第一个try组不调用析构函数,第二个类调用第一个类的析构函数,第三个类调用前两个类的析构函数,以此类推)。我的问题是:最常见的处理方法是什么? 另外,假设类对象包含一个不是用new创建的对象(因为它在堆栈上

  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com

  • 我有一个类< code >配置: 配置java 我如何将它注入到某个构造函数中,例如: 我希望这个字符串 从配置中注入了值。这可能吗?

  • 问题内容: 这是一段代码,作为示例,其余的只是方法(迷宫类的底部)。所以当实例化时,使用 和 这将打印出网格阵列。这是合法的吗?我认为所有类都需要构造函数,它如何打印出二维网格数组? 迷宫课: 问题答案: 不需要 显式 定义构造函数;但是,所有类都必须具有构造函数,如果不提供任何默认构造函数,则将生成默认的空构造函数: 请参见默认构造函数。

  • 有了Deck对象之后,我们有必要初始化其中的Card对象。上一章的buildDeck函数稍作修改就可使用,但是更自然的方法是为Deck类再添加一个构造函数,代码如下: Deck::Deck () { apvector<Card> temp (52); cards = temp; int i = 0; for (Suit suit = CLUBS; suit <= SPADES; s