spring中两个重复重要的概念
IoC——Inversion of Control,控制反转
在Java开发中,IoC是将你设计好的类交给系统去控制,而不是在你的类内部控制。IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。
DI——Dependency Injection(依赖注入)
即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
如何理解上面的两个概念?
控制反转:是谁控制了谁?哪些方面发生了反转?为什么需要反转?
依赖注入:谁依赖谁?注入什么?
如何来回答上面的这些问题,那就从IOC/DI的演变过程来看。
1、java基本阶段
B类里面需要使用接口A,最原始的写法是: A a = new A1(); 或 A a = new A2(); 然后通过a来调用接口的方法。
对B来说是主动实例化对象,直接获取依赖。
缺点:更换实现需要重新编译源代码,耦合性很强,很难更换实现。
2、Factory阶段
使用工厂模式—Factory,在 B类里面需要使用接口A,应用工厂模式的写法是: A a = Factory.createA();然后通过a来调用接口的方法。对 B来说是被动实例化对象,间接获取依赖,但对工厂类来说是主动的。
缺点:更换实现需要重新编译源代码,很难更换实现、难于测试。
3、Factory + Xml + 反射 阶段
工厂模式加配置文件—Factory+xml+反射,在B类里面需要使用接口A,应用工厂模式的写法是:
A a = Factory.createA();
然后通过a来调用接口的方法。在工厂类里使用配置文件来决定要实例化的具体类。对C类说是被动创建对象,间接获取依赖,对工厂来说也是被动的。
采用这种方式,当然比上面的要好多了,也是我们经常用的。但这种方式也存在相应的问题:如何实例化带参数的类,如
何在对调用的方法传递值等。
4、IoC/DI阶段
继续进化,就到了IoC/DI的层次,利用容器对IoC/DI涉及的元素进行整体控制,并提供更多更好的通用服务。此时在B类里面需要使用接口A,以Spring为例:
A a = BeanFactory.getBean(“XX”);
然后通过a来调用接口的方法。此时由容器来创建对象和装配对象,并管理对象生命周期。对于应用程序
而言,就是被动实例化和被动接受依赖了。
最后总结,对IOC容器及IOC的理解:
IoC容器
简单的理解就是:实现IoC思想,并提供对象创建、对象装配以及对象生命周期管理的软件就是IoC容器。
IoC理解
1、应用程序无需主动new对象;而是描述对象应该如何被创建即可,IoC容器帮你创建,即被动实例化;
2、应用程序不需要主动装配对象之间的依赖关系,而是描述需要哪个服务IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;
3、应用程序不知道依赖的具体实现,只知道需要提供某类服务的对象(面向接口编程)、并松散耦合;
4、是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。