前言

由于种种原因,spring新手攻略已经中断好久了,最近打算重新把这个坑填完,不管如何,要有始有终嘛。好了,本篇主要来讲讲spring中大名鼎鼎的依赖注入(Dependency Injection)。

引入

在讲依赖注入之前,我们先来聊聊面向对象。在面向对象中,最常用到的两种技术是继承和组合,而在大多数情况下,似乎组合方式更好,至于为什么,可以查阅相关资料。说到组合,无非就是把一个类作为另一个类的属性。这确实非常强大,因为当一个类包含另一个类时,也就拥有了另一个类的功能。但是,在享受好处的同时也带来了不好的东西,一个明显的原因就是两个类之前耦合度增加了。这违背了软件工程中高内聚低耦合的原则。于是乎,spring框架看到了这点,并很好的解决了它。说到这里,读者可能疑惑,耦合度增加了又怎么样?有什么关系嘛!如果是写点小程序确实没关系,而且挺好的。但是当进行大规模的工程时候就能体会到它的重要性了。比如当你要对一个类进行单元测试的时候,如果对于另一个类依赖太大,那将会变得非常麻烦。为什么这么说呢?因为假设类A依赖的另一个类B在实例化的时候需要做一堆动作,比如要从数据库获取数据等。而你测试的时候,不想这么麻烦,因为你只想测试类A,至于它的一个属性类B则不关心。这时候,就轮到依赖注入登场了。还是从一个例子开始把:

小示例

假设你的应用程序中有一个文本编辑组件,你想给它提供一个拼写检查的功能。对于这样的一个需求,你可能会写下面的代码:

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

上面的代码片段,其实TextEditor就对Spellchecker产生了依赖,因为它必须实现一个Spellchecker类型的对象。现在我们要把Spellchecker的控制权交出来,于是有了下面的代码:

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

思路其实还是充分运用面向对象编程的技巧,要基于接口编程,没错,这里我们在类中Spellchecker是一个接口,至于如何实现,我们不关心,把实现通过构造器注入进去。而它的实现则有spring框架控制,例如通过xml配置文件来声明。本文就介绍到这里,下篇将主要介绍spring中两中两种注入方式。

小结

本文简单介绍了依赖注入,下篇更精彩,敬请期待~

##文档信息