Java 依赖注入如何实例化没有构造函数的类?

Java 依赖注入如何实例化没有构造函数的类?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我遵循了以下依赖项注入示例: 例如TextEditor类(来自上面的链接): 当这些依赖项/类没有任何构造函数时,如何实例化它们 Java只是在生成一个空的对象吗?就像没有任何代码的空参数构造函数 谢谢你让这更清楚 如果未定义构造函数,则可以通过无参数默认构造函数实例化类 因此,框架调用该构造函数(假定使用反射),然后使用set方法设置新创建的类的一个字段 如果未定义构造函数,则可以通过无参数默认构造函数实例化类 因此,框架调用该构造函数(假定使用反射),然后使用set方法设置新创建的类的一个字

我遵循了以下依赖项注入示例:

例如TextEditor类(来自上面的链接):

当这些依赖项/类没有任何构造函数时,如何实例化它们

Java只是在生成一个空的对象吗?就像没有任何代码的空参数构造函数


谢谢你让这更清楚

如果未定义构造函数,则可以通过无参数默认构造函数实例化类


因此,框架调用该构造函数(假定使用反射),然后使用set方法设置新创建的类的一个字段

如果未定义构造函数,则可以通过无参数默认构造函数实例化类


因此,框架调用该构造函数(假定使用反射),然后使用set方法设置新创建的类的一个字段

除非另有规定,否则每个Java类都有默认构造函数。因此,这里有一个默认的
public TextEditor()
构造函数,即使您还没有为它编码。(如果需要从public更改其可见性、声明抛出的异常等,可以对其进行编码。)


因此,是的,Spring调用这个默认构造函数-然后调用
setSpellChecker
方法(通过注释和反射)来填充它。

除非另有规定,否则每个Java类都有默认构造函数。因此,这里有一个默认的
public TextEditor()
构造函数,即使您还没有为它编码。(如果需要从public更改其可见性、声明抛出的异常等,可以对其进行编码。)


因此,是的,Spring调用了这个默认构造函数,然后调用
setPellChecker
方法(作为注释,并通过反射)来填充它。

上面的示例使用Spring注释和Spring上下文文件,考虑到DI,它们是项目的主要和最重要部分

因此,在上下文文件中有以下行:

<!-- Definition for spellChecker bean -->
<bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
</bean>

这定义了一个引用
拼写检查器的类,该类映射到类
com.tutorialspoint.spellChecker
,一旦编译器在对象实例化时在标记为
@Autowired
的方法中找到此类属性,它就会注入/设置所需依赖项的相关版本

在属性与applicationContext.xml文件中的引用标记不匹配的情况下,Spring试图映射类型,例如,名为
mySpecialSpellChecker
的属性,其类型为
com.tutorialspoint.SpellChecker
仍将映射到具有
id=“SpellChecker”的bean
如果有多个相同类型的对象,Spring将不会实例化您的对象,并且您可能会得到编译时错误,因为Spring不知道这两个(或更多)的哪个版本是正确的,因此这需要开发人员输入

执行顺序如下:

  • 实例化
    textEditor
    ,它有默认构造函数,在代码
    public textEditor()中不可见
  • 新实例设置在可用对象池中,引用
    textEditor
  • 实例化
    拼写检查器
    并添加到具有相关引用/标签的可用对象池中
  • 所有的
    @Autowired
    属性/方法都是通过相关对象设置/调用的,在这种情况下,Spring调用:
    setSpellChecker(拼写检查器)

  • 上面的示例使用Spring注释和Spring上下文文件,考虑到DI,这些是项目的主要和最重要部分

    因此,在上下文文件中有以下行:

    <!-- Definition for spellChecker bean -->
    <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
    </bean>
    
    
    
    这定义了一个引用
    拼写检查器的类,该类映射到类
    com.tutorialspoint.spellChecker
    ,一旦编译器在对象实例化时在标记为
    @Autowired
    的方法中找到此类属性,它就会注入/设置所需依赖项的相关版本

    在属性与applicationContext.xml文件中的引用标记不匹配的情况下,Spring试图映射类型,例如,名为
    mySpecialSpellChecker
    的属性,其类型为
    com.tutorialspoint.SpellChecker
    仍将映射到具有
    id=“SpellChecker”的bean
    如果有多个相同类型的对象,Spring将不会实例化您的对象,并且您可能会得到编译时错误,因为Spring不知道这两个(或更多)的哪个版本是正确的,因此这需要开发人员输入

    执行顺序如下:

  • 实例化
    textEditor
    ,它有默认构造函数,在代码
    public textEditor()中不可见
  • 新实例设置在可用对象池中,引用
    textEditor
  • 实例化
    拼写检查器
    并添加到具有相关引用/标签的可用对象池中
  • 所有的
    @Autowired
    属性/方法都是通过相关对象设置/调用的,在这种情况下,Spring调用:
    setSpellChecker(拼写检查器)

  • 一个没有构造函数的类总是有默认的构造函数TextEditor(),当我看到这个例子时,我哭了。从OO编程的第一天开始,就不鼓励Setter注入。Spring的Chap花了大约11年的时间才弄明白这一点,但他们现在已经整理好了自己的行为(请参见一个没有构造函数的类总是有默认的构造函数TextEditor()我看着这个例子,我哭了。从OO编程的第一天起,Setter注入就不被鼓励了。Spring的伙计们花了大约11年的时间才弄明白这一点,但他们现在已经理清了自己的行动(参见