001.Spring | 依赖注入原理分析

下面谈谈Spring是如何实现反转模式IoC或依赖注入模式DI: 平时,咱们须要生成一个对象,使用new语法,如一个类为Ajava

public class A {
      public void m1() {
            System.out.println(this.getClass().getName()+":Hello");
      }
}
复制代码

若是咱们在 B中调用A,那么以下代码:编程

package com.os.test;
//B类中使用A类
public class B {
      //B类中调用A类
      //每一次执行invoke方式,都生成一个A的对象,若是
      //A对象代码比较长,挺费时费力
      public void invoke() {
            A a = new A();
            a.m1();
      }
}
复制代码

每次执行invoke方法时,都要生成一个A对象,若是A对象代码较长,这是费时的事情。因而有以下写法:设计模式

package com.os.test;
//C类中使用A类
public class C {
      //A类变成了C类中的属性,可是我不想当即对A进行实例化操做
      //咱们想经过外界传入A对象,涉及到了涉及模式
      private A a = new A();//不许直接进行初始化操做
      public void invoke() {
            a.m1();
      }
}
复制代码

将A对象变成C的类属性。 若是咱们不想在C中实现A的实例,也就是不想当即new A(),而是想经过外界传入, 注意,若是你想知道为何,这里涉及到设计模式以及解耦等因素,进一步感兴趣者可学习 23 种设计模式。函数

若是想让A的实例从外界传入,有两种写法:学习

  • 构造方法
package com.os.test;
//D类中使用A类
public class D {
      private A a ;//我须要给a进行初始化操做
      public D(A a) {//构造方法进行赋值==注入
            this.a = a;
      }
      public void invoke() {
            a.m1();
      }
}
复制代码
  • setter方式
package com.os.test;
//F类中使用A类
public class F {
      private A a ;//我须要给a进行初始化操做
      public void invoke() {
            a.m1();
      }
      public void setA(A a) {//注入
            this.a = a;
      }    
}
复制代码

上述两种写法在编程中是常常发生的,D(或F)做为调用者,A是被调用者,A的实例化不在调用者D(或F)内部中完成,而是经过构造函数或setXXX方法赋值进来,这种方式咱们称为依赖性注入(DI 或者 IoC 模式),D(或F) 和A 的依赖联系是经过构造函数或setXXX 方法赋值进来,这样, 最大程度解耦了调用者D(或F)和被调用者A之间的耦合联系。this

相关文章
相关标签/搜索