IOC
文章会同时发布在同名公众号《码可思》,一个适合学生党的公众号!
带你通俗易懂走进编程世界!
1、什么是IOC
IOC(Inversion of Control)就是控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
控制反转简单来说就是:“你不需要来找我,我自己去找你”
举个例子: 现在我们在类A中需要用到类B的对象
-
传统的方式:就是在类A中去new出来一个类B的对象
-
使用IOC技术:此时在我们类A中,只需要去定义一个类B的对象,而不需要像传统的方式去new出来。它是通过IOC容器在外部将类B的对
象new出来,然后再注入到类A中去。所以,我们需要哪个对象,就可以在容器中拿。
以上的两种方式:
无非就是将我本身具有的权力(能去主动创建对象),交给了IOC容器,使得我们自己再也不需要去考虑创建哪个对象了。
2、DI (依赖注入)
了解过Spring的同学应该都知道,Spring的核心机制就是DI。但是我们还需要知道的一点就是,IOC并不是Spring特有的。
注入的两种方式
- Setter方式(传值方式)
- 构造器方式(引用方式)
依赖注入的时间
- 当我们第一次通过getBean去向IOC容器获取Bean,此时会触发依赖注入
- 当我们在Spring的配置文件.xml中配置Bean的属性
lazy-init
属性的时候,即关闭懒加载,这时候容器在注册bean 的时候就会进行实例化,此时触发依赖注入
PS:懒加载就是当我们容器去注册bean 的时候,不会创建对象,等到我们真正调用到的时候才回去加载对象,Spirng默认是开启懒加载 的。
- 优点:对象使用的时候才去创建,节省资源。
- 缺点:不利于提前发现错误。
3、IOC 解决了什么问题?
1、对象之间的耦合度或者说依赖程度降低
- 我们都知道判断一个程序的好坏,耦合性的高低是个重点,因为这涉及到你程序的可维护性。所以IOC很好的优化了这一点。
2、资源能够更好的管理
- 当你需要使用一个实现类的对象时候,可以直接从容器中拿到,然后很容易的可以实现一个单例。
下面详细的来说一下IOC:
阿蓝前期在学习的时候在CSDN上面看到一个生动的例子,我觉得很好的向我们展示了控制反转的好处。
生动的例子如下:
假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。
这个时候,如果我们的顶头上司要求我们将轮子换大一码,那么这下子就麻烦了,按照轮子量身定做的底盘,还有车身以及汽车。就都得全部重新设计了。这样的可维护性就非常的低!
我们换一种想法,们先设计汽车的大概样子,然后根据汽车的样子来设计车身,根据车身来设计底盘,最后根据底盘来设计轮子。这时候,依赖关系就倒置过来了:轮子依赖底盘, 底盘依赖车身, 车身依赖汽车。
这样子之后,如果要将轮子换大一码,就只需要更改一下轮子的设计,而不用去全部改动全部的配件。
这个例子很好的像我们展示了 控制倒置原则。
我们的IOC 就是依赖倒置原则的一种代码设计思路,然后采用的方法就是DI(依赖注入)这三者的关系是:
讲到最后,在来一个例子彻底了解完IOC
例如:现在有个User的实体类,然后需要对User进行开发操作,利用service和Dao层进行开发
首先我们传统的方式:
此时我们可以看到Dao层只有一个实现类,这样其实还看不出什么差别。但是要是Dao层多了一个实现类。举个例子,我们在Service层中,去对Dao层进行操作,将User分为两大类,一个是员工,一个是领导。那么这个时候Dao层就需要多一个实现类了。此时,当我们要调用Dao层的时候,就需要去改Service中的代码,new出来我们想要的对象。
然后我们使用IOC
,将控制权交给IOC容器
去管理,在需要用到的时候去容器中拿
这样的话,我们就不用在Service中写过多的new去创建出我们所依赖的对象了,而只需要自己去维护好中间的这个配置文件(.xml文件
),学过Spring的应该也都清楚。这样也大大较少了我们的代码量!
说到底,其实就记住一句话,什么是控制反转呢?
其实本质上就是将内置对象的控制权交给了容器。
END
最后希望这篇文章能够帮助到你,如果文章中存在什么错误,请大家加以指正!