依赖注入模式 反转模式

  依赖注射概念最早是 Uncle Bob 在他May 1996的 C++报告, The Dependency Inversion Principle.

  Bob 在他的书籍中也谈论了这个原理, “Agile Software Development, Principles, Patterns, and Practices, and Agile Principles, Patterns, and Practices in C#

  这个原理简单归结如下:

  1. 高层次模块不应该依赖低层次模块,他们应该依赖于一种抽象。
  2. 这种抽象不应该依赖细节,细节应该依赖于抽象

  依赖倒置解决了高层次模块依赖于低层次模块和其细节的问题。

  Dependency injection 是一个将行为从依赖中分离的技术,简单地说,它允许开发者定义一个方法函数依赖于外部其他各种交互,而不需要编码如何获得这些外部交互的实例。 这样就在各种组件之间解耦,从而获得干净的代码,相比依赖的硬编码, 一个组件只有在运行时才调用其所需要的其他组件,因此在代码运行时,通过特定的框架或容器,将其所需要的其他依赖组件进行注入,主动推入。

  依赖注入可以看成是 反转控制 inversion of control 的一个特例。反转的是依赖,而不是其他,JNDI也是一种反转控制,它反转的JNDI名称或资源。参考: “Inversion of Control Containers and the Dependency Injection pattern”

  依赖注入是最早Spring和piconcontainer等提出,如今已经是一个缺省主流模式,并扩展到前端如Angular.js。本主题国内最早IOC和依赖注入的讨论专题。

  依赖注入与IOC模式类似工厂模式,是一种解决调用者和被调用者依赖耦合关系的模式,自2004年诞生以来,至今已经成为Java和其他领域的主流模式。它解决了对象之间的依赖关系,使得对象只依赖IOC/DI容器,不再直接相互依赖,实现松耦合,然后在对象创建时,由IOC/DI容器将其依赖的对象注入Inject其体内,故又称依赖注入依赖注射模式,最大程度实现松耦合,特别是Autowiring/Autowired自动配对引入,再结合Java的垃圾回收机制,使得在Java中,对象不再需要开发者自己创建,也需要开发者自己销毁,只需要直接使用即可,大大提升了开发效率。

  详细解释:依赖注入说白一点,就是容器将某个类依赖的其他类注入到这个类中。

  那么什么是依赖?如下代码表示A依赖B,因为Ad的方法行为mymehtod有一部分要依赖B的方法m实现,如同小孩在某些行为要依赖父母帮助完成一样,父母亲经常在小孩需要做什么事情时,主要帮助其做好,把他需要的结果直接给他,这也是一种依赖注入,(长此以往,小孩的独立性会丧失):

public class A{

  private B b;

  public A(B b){
    this.b = b;
  }
  public void mymethod(){
    b.m();
  }

}

  在通常情况下,我们是在使用A时同时需要将B的实例赋予A。

  A a = new A(new B());
  a. mymethod();

  而通过依赖注入容器或框架,A对B的依赖无需我们编写代码时赋予,只要我们从一个工厂或容器中获取A的实例,这个工厂或容器是依赖注入框架提供的,它会在里面偷偷地将B的实例注入到A中:

  A a = factory.getA();
  a. mymethod();

  这样,我们客户端调用代码就只和A耦合,这样,我们无需打开A的代码,观察其内部和哪些其他类发生依赖耦合,然后手工将这些依赖的实例注入其中。

  更详细的讲解见:Ioc模式/依赖注射模式

  Spring依赖注入原理分析

Pico、JMX、微容器以及对象的易管理性
  PicoContainer等微容器正日益受到关注和广泛应用;J2SE5.0将JMX作为JDK基本API,这些技术都表明对象的易管理性呼之欲出。

Ioc容器的革命性优点

SOLID面向对象设计原则

伪命题:Java传递的值还是引用?

使用依赖注入实现聚合根之间调用的逻辑悖论

依赖注入与事件编程

Scala依赖注入Cake模式

Scala使用Reader Monad实现依赖注入

在Angular.js使用组合+依赖注入而不是继承

Jive论坛与Spring框架

CDI是什么?

CDI与JavaEE6

Ioc模式 Dependency Injection模式和AOP讨论

Spring教程与源码专题

Angular.js教程

DCI架构

更多依赖注入 反转模式专题讨论