IOC和DI的理解
IOC和DI的概念
IOC(Inversion of Control) :控制反转
就是把对象的创建以及依赖交由IOC容器来管理,对象内部不再需要直接New对象。
DI(Dependency Injection) : 依赖注入
对象内部需要其他对象的支持,则容器将自动把所需的对象提供给对象
举一个生活中的例子:
传统情况下:
在以前没有网购的时候,我们需要一件商品,我们都会主动去商店那购买。
这就有点像,我们在一个Java类中,如果需要一个其他的类的支持,我们就需要去new这个类
public class Test {
public static void main(String[] args) {
ClassA a = new ClassA();
}
}
IOC情况下:
现在是网购的时代,我们需要一件商品,我们可以直接去网购平台网购,手指点一下下单,就有快递员把商品送到家门口了。
这里说的网购平台,就有点像IOC容器了。而快递员把商品送到家门口,就像是依赖注入。
现在我们在某一个类中,如果需要其他类的支持,就不再需要直接去new这个类的实例,而是由IOC容器提供给我们
由IOC容器来管理类
public class IOC {
public static Object getBean(String beanName) {
if (beanName.equals("ClassA")) {
return new ClassA();
}
if (beanName.equals("ClassB")) {
return new ClassB();
}
return null;
}
}
当我们需要某一个类时,可以由第三方容器提供给我们,不需要我们直接去new对象实例
public class Test {
public static void main(String[] args) {
// 依赖注入
ClassA a = IOC.getBean("ClassA");
}
}
为什么需要IOC和DI呢
在没有IOC的时候,我们需要其他类的支持,就要手动去new其他类的实例,这样会造成代码的耦合性过高,如果当我们的需求发生改变,我们就需要去修改源代码,造成很多不便。
比如一个接口A,名叫InterfaceA
这个接口有一个实现类,名叫是InterfaceAImpl
如果我们不使用IOC去管理的话
那么就是
InterfaceA a = new InterfaceAImpl()
如果我们在很多类都这样去直接new实现类
当我们需求发生改变,我们又开发了新的接口A的实现类InterfaceAaImpl
那么我们就要去修改源代码
InterfaceA a = new InterfaceAaImpl()
非常的麻烦
如果我们使用了IOC
我们只需要把接口的实现类交由IOC容器去管理
当我们更改了接口的实现类,我们只需要修改容器对应的配置,即可切换新的接口实现类了,
这样IOC容器就会自动把新的实现类注入到所需的地方
另外补充一下,IOC是一种思想,而DI才是实现IOC思想的一种方式之一
下面是我画的图,来进一步解释IOC和DI