ioc(Inversion of Control)
控制反转,也可以称为依赖倒置,即当A要调用B时,A无需主动获取,会有人主动把B送过来供A使用,以减少在A的代码中存在B,导致模块间的高度耦合。
正常的代码控制流程
1.创建一个接口Car
1 | public interface Car { |
2.定义两种车实现接口car
1 | public class Benz implements Car { |
3.人要开车
1 | public class Person { |
- 这种方式是我们常见的代码控制流程,人想要开车,需要自己实例化,且这个人只能开一种车。
- 如何让他可以想开什么车就开什么车呢?
通过依赖注入
依赖注入的方式DI(Dependency Injection)
- 依赖注入是实现控制反转的方式之一。
- 看一下修改后的person类
1 | public class Person { |
现在的Person类已经不自己实例化车的对象了,而是通过构造函数来获得车的对象,所以,这个类就可以开各种车了,只要这个车实现了Car接口就可以。看一下如何使用Person类
1 | public static void main(String[] args) { |
现在的Person类可以开不止一种车,只要你通过构造函数传递进来。在这个例子中,Car对象就是Person类的依赖,当我们实例化Person类时,将一个Car的实例传递给Person类,就是依赖注入,我们的Person类从而实现了控制反转。
控制反转到底反转了什么?有种说法是这样的:所谓控制反转,反转的是获取对象依赖的过程。控制权反转后,获取依赖对象的过程由自身管理变为由IOC容器注入。
Spring实现依赖注入的方式
在上面的这行代码中Person p=new Person(new Benz());,我们通过手动的方式new了一个Benz()的对象,然后将其注入到Person类中。而Spring不这么干,因为Spring觉得,你这行代码实例化了一个具体的Benz类,如果你以后想要在这里实例化一个BMW类的话,岂不是要修改代码?那我干脆写到配置文件里好了,即便你将来要该注意,至少不需要修改代码,于是就有了下面的配置
1 | <beans> |
从配置文件中获取Person类的对象时,car对象会被自动装配进来,而person对象不需要关心到底是哪个具体的类被传递进来了。所以,Spring作为一个IOC框架主要做了两步:创建对象和组装对象之间的关系。