(一)IOC(Inversion of Control):控制反转
Spring的IOC容器获得控制权。
(1)在类内部不为对象a赋值
public class A {
public void print(){
System.out.println("hello");
}
}
public class B {
private A a;
public void print(){
a.print();//a为null,调用该方法会有空指针异常
//因此必须为属性a赋值,那么怎么赋值呢?
}
}
(2)在类内部为对象a赋值
public class B {
private A a=new A();//由类本身控制对象a,控制权在自己手上
public void print(){
a.print();
}
}
(3)在类外部为对象a赋值(需要set方法)
public class B {
private A a;
public void setA(A a) {
this.a = a;
}
public void print(){
a.print();
}
}
public class Main {
public static void main(String[] args) {
A a=new A();
B b=new B();
b.setA(a);//在类外部为属性a注入值,控制权被交出来了
b.print();
}
}
(4)在Spring框架中,Spring的IOC容器获取控制权,即控制权反转给IOC容器了。
由IOC容器调用set方法为对象属性注入值。
(5)IOC容器为依赖对象注值有2种方式:调用set方法;注解注入。后续讲解
(二)DI(Dependency Injection):依赖注入,DI是IOC的另一种表述
(1)DI是IOC的另一种表述,IOC和DI说明的是同一件事物。
(2)容器为我注入依赖对象,而不是我自己去注入依赖对象。即由IOC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
(3)我们依赖容器获取资源,容器把资源给我们。
(4)相对于IOC而言,DI的表述更容易被理解