Dependency Injection

以下内容翻译自这篇文章http://www.vogella.com/articles/DependencyInjection/article.html

依赖注入(Dependency Injection)的思想来源于控制反转(Inversion of Control) ,也就是说, 一个类不应该自己去决定它依赖于谁,而应该由外部程序来配置。

依赖到定义是,如果A类用了B类的实例,那么A对B有依赖。

程序中最理想的状况是一个类要尽可能的独立于其他的类,这样才能增加使用这些类的可能性,以及单独测试它们的可能性。如果一个类内直接用new创建另外一个类的实例,那么它就不能独立的被使用和测试。

应该从外部来解耦一个类和它到依赖。比如下面例子中一个Java类简单的定义了它的需求:

  • public class MyPart { @Inject private Logger logger; // DatabaseAccessClass would talk to the DB @Inject private DatabaseAccessClass dao; @Inject public void init(Composite parent) { logger.info("UI will start to build"); Label label = new Label(parent, SWT.NONE); label.setText("Eclipse 4"); Text text = new Text(parent, SWT.NONE); text.setText(dao.getNumber()); } }

 另外一个类能够读取它的依赖,然后创建MyPart的实例,并向这个实例中“注入”它需要的依赖。注入依赖的过程可以通过Java的反射机制来完成。“另外一个类”称之为依赖容器(dependency container),它是一个框架类(framework class)。

这种方式下MyPart类并没有规定什么硬性依赖(hard dependency),也就是说,它没有依赖于任何一个其他类的实例。如果你向测试这个类,你可以向它注入一个模拟对象(mock object)。

模拟对象并不是真的对象,它们只是用来模拟真正对象到行为。

依赖注入可以发生在:

  • 类的构造函数中(构造注入construction injection)
  • 类方法中(方法注入method injecion)
  • 类成员中(成员注入feild injection)

依赖注入同样可以在静态成员中发生。

你可以不用任何其他到框架来实现依赖注入,比如用构造函数,getter/setter方法就能实现。但是一个好的依赖注入框架能够简化类的初始化过程,并且提供正确到依赖对象。

比较流行到依赖注入框架是Spring和Google Guice。

posted @ 2013-03-31 22:27  Allan_Dragoon  阅读(186)  评论(0编辑  收藏  举报