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