现在的位置: 首页 > 综合 > 正文

依赖注入

2012年12月18日 ⁄ 综合 ⁄ 共 898字 ⁄ 字号 评论关闭

依赖注入解决的是依赖对象的创建与管理,更准确来说,是“依赖关系”的管理。

以一个Coder类和一个Computer类为例,代码民工总归是要有电脑才能工作的嘛,所以Coder对象要包含一个Computer对象,即Coder类对Computer类产生依赖了。

最原始的情况下,可能是类似下面这样的代码,依赖关系硬编码到代码中

Coder qsort = new Coder("qsort", new Computer("Dell Optiplex 990"));

硬编码带来的当然是灵活性的降低和可维护性的下降,使得Coder和Computer这两个concrete class有了硬依赖。更好的做法是将Computer类提取出一个行为接口,给出多种实现,和一个factory来按需创建对象,如下

Coder qsort = new Coder("qsort", ComputerFactory.getInstance("Dell Optiplex 990"));

但这仍然在代码上有所依赖。

本质上,上面两种情况中的依赖关系是由qsort主动建立的(通过ctor),factory只是将对象的创建由qsort移到了factory,依赖关系的建立仍然是由Coder完成。

而所谓“依赖注入”,则是将这种依赖关系的建立提到更高的层面,通过framework等来建立。具体来说,Coder通过某种方式指定自己对Computer类的依赖(例如通过外部配置文件),之后,Coder对Computer的依赖关系的建立将由外部framework根据配置文件指定的依赖来自动帮其建立,Coder无须主动去管理自己的依赖关系。由于这种依赖关系的建立是由外部注入到Coder类中的,所以称之为“依赖注入”。

依赖注入实现的是“控制翻转(Inversion of Control)”,Java圈儿就是喜欢玩概念,各种各样的名词。

Dependency Injection的实现可以有多种方式,参见http://en.wikipedia.org/wiki/Inversion_of_control

Spring框架实现的是setter injection和ctor injection。

抱歉!评论已关闭.