深入解析Java的Spring框架中bean的依赖注入

时间:2021-05-19

每一个基于java的应用程序都有一个共同工作来展示给用户看到的内容作为工作的应用几个对象。当编写一个复杂的Java应用程序,应用程序类应该尽可能独立其他Java类来增加重复使用这些类,并独立于其他类别的测试它们,而这样做单元测试的可能性。依赖注入(或有时称为布线)有助于粘合这些类在一起,同时保持他们的独立。

考虑有其中有一个文本编辑器组件的应用程序,要提供拼写检查。标准的代码将看起来像这样:


public class TextEditor { private SpellChecker spellChecker; public TextEditor() { spellChecker = new SpellChecker(); }}

我们在这里所做的就是创建文本编辑和拼写检查之间的依赖性。在控制方案中的反转,我们反而会做这样的事情:

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

在这里,文本编辑不应该担心拼写检查落实。拼写检查器将独立实施,将提供给文本编辑在文本编辑实例化的时候,这整个过程是由Spring框架的控制。

在这里,我们已经删除从文本编辑的全面控制,并保持它在其他地方(即XML配置文件)和依赖性(即类拼写检查)被注入到类文本编辑通过类构造函数。因此,流程控制已经“倒”通过依赖注入(DI),因为已经有效地委派依赖一些外部系统。

依赖注入的第二种方法是通过文本编辑类,我们将创建拼写检查实例的setter方法​​,该实例将被用来调用setter方法​​来初始化文本编辑的属性。

因此,DI主要有两种变体和下面的两个子章将涵盖两者结合实例:

基于构造函数的依赖注入
当容器调用类的构造函数有多个参数,每个代表在其他类中的构造函数依赖关系为基础的DI来完成。

例子:
下面的例子显示了一个类文本编辑TextEditor 只能是依赖注入与构造函数注入。

我们使用Eclipse IDE,然后按照下面的步骤来创建一个Spring应用程序:

这里是TextEditor.java文件的内容:

package com.yiibai;public class TextEditor { private SpellChecker spellChecker; public TextEditor(SpellChecker spellChecker) { System.out.println("Inside TextEditor constructor." ); this.spellChecker = spellChecker; } public void spellCheck() { spellChecker.checkSpelling(); }}

下面是另外一个相关的类文件SpellChecker.java内容:

package com.yiibai;public class SpellChecker { public SpellChecker(){ System.out.println("Inside SpellChecker constructor." ); } public void checkSpelling() { System.out.println("Inside checkSpelling." ); } }

以下是MainApp.java文件的内容:

package com.yiibai;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); TextEditor te = (TextEditor) context.getBean("textEditor"); te.spellCheck(); }}

以下是配置文件beans.xml文件里面有配置为基于构造函数的注入:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://.example.Person" p:name="John Doe"/> </bean></beans>

在这里,不应该在指定原始值和对空间对象引用的区别。-ref部分表示,这不是直链的值,而是一个引用到另一个bean中。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章