下面谈谈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();
}
}
复制代码
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