当前位置: 首页 > 面试题库 >

存在多个构造函数时,使用autowire =“ constructor”进行依赖注入?

魏浩广
2023-03-14
问题内容

我有下面的构造函数的文本编辑器类

 public class TextEditor {
       private SpellChecker spellChecker;

       private SpellChecker1 spellChecker1;

       private SpellChecker2 spellChecker2;

     public TextEditor(SpellChecker spellChecker) {
          this.spellChecker = spellChecker;
        }

       public TextEditor(SpellChecker2 spellChecker2) {
              this.spellChecker2 = spellChecker2;
           }

       public TextEditor(SpellChecker spellChecker, SpellChecker1 spellChecker1,SpellChecker2 spellChecker2) {
              this.spellChecker = spellChecker;
              this.spellChecker1 = spellChecker1;
              this.spellChecker2 = spellChecker2;
           }

       public TextEditor(SpellChecker spellChecker, SpellChecker1 spellChecker1) {
              this.spellChecker = spellChecker;
              this.spellChecker1 = spellChecker1;
           }
        }

在春豆中,我有

<bean id="textEditor" class="com.TextEditor" autowire="constructor">
</bean>

我观察到的是带有两个参数的构造函数,称为一致。它是随机的吗?是否应该不抛出弹簧异常,因为它不知道需要调用哪个构造函数?


问题答案:

这是Spring自动装配构造函数的结果。

它要做的第一件事是获取所有bean类的构造函数并对它们进行排序,首先将公共构造函数的参数数量减少,然后再将所有非公共构造函数的参数数量减少。这些是候选构造函数。

然后,它会遍历这些候选项,尝试从中生成参数BeanFactory。如果不能因为缺少bean或其他原因而无法跳过,则跳过候选对象。如果成功找到参数,它将根据许多因素(参数列表长度,参数类型与参数的接近程度等)为当前候选构造函数赋予权重。然后,它会检查前一个候选人的体重,如果一个人比另一个人好,就交换他们的体重。

如果在此过程结束时有候选构造函数,则Spring将使用它。

如果您说Spring在使用3 arg构造函数而不是3 arg构造函数,那么这意味着您在3 arg构造函数中没有类型之一的bean。



 类似资料:
  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 当容器调用具有许多参数的类构造函数时,完成基于构造函数的DI,每个参数表示对另一个类的依赖。 例子 (Example) 以下示例显示了一个类TextEditor ,它只能通过构造函数注入进行依赖注入。 让我们有一个可用的Eclipse IDE,并按照以下步骤创建一个Spring应用程序 - 脚步 描述 1 创建一个名为SpringExample的项目,并在创建的项目中的src文件夹下创建一个包co

  • 我是新手。所以我想在我的使用MVVM架构的项目上尝试依赖注入。结构如下:JsonHelper- 当我试图在RemoteDataSource和Repository上注入DI时,出现了问题,因为这些类是单例类,并且有一个私有构造函数。错误代码如下所示 这是我的远程数据源和存储库代码,我已经尝试将其注入构造函数,但它说Dagger不能注入私有构造函数,所以我尝试将其注入函数,但仍然不起作用 远程数据源.

  • 在我的ASP. NET Core应用程序中,我有一个具有多个构造函数的标记助手。当ASP. NET 5尝试解析类型时,这会在运行时导致以下错误: 在类型'MyNameSpace中发现了多个接受所有给定参数类型的构造函数。MyTagHelper'.应该只有一个适用的构造函数。 其中一个构造函数是无参数的,另一个有一些参数不是注册类型的参数。我希望它使用无参数构造函数。 有没有办法让ASP. NET

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。