当前位置:
首页 >
前端技术
> javascript
>内容正文
javascript
抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单
生活随笔
收集整理的这篇文章主要介绍了
抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
- 很多小伙伴们看到标题可能就会想到抛开 Spring 就不会存在 IOC 思想了,其实不然在接下来的文章中就会讲述到。
- 很多小伙伴在理解 IOC 的时候通常会和 Spring 放到一起去学习,首先呢 Spring 设计的非常之巧妙而且里面包含了很多除去 IOC 的其他功能。这样会导致我们在 Spring 的基础去理解 IOC 就变得很困难。很难抓住其核心思想。
- 所以本文的标题的含义就是单纯的去理解 IOC 思想,然后通过自定义的 IOC 去加深对 IOC 的理解。
- 看完本文之后再去理解 Spring 中的 IOC 其实思想是一致的,只是实现上有些出入。毕竟 Spring 是大神们经过深思熟虑后的成果。
传统的思想(没有 IOC 容器的情况下)
在没有 IOC 容器的情况下,如果我们需要某个类具体的操作如下所示:
传统的 Bean 创建
优点
- 很直接的一个优点就是简单,我们需要什么就去创建什么,在程序员的角度上也是比较直观容易理解的。
缺点
- Bean 之间的协调关系是由程序内部代码来控制的即通过 New 关键字与我们的业务代码进行了强耦合。
- 没有对 Bean 进行管理。
- 对 Bean 没有进行统一的管理和配置。
IOC 思想
首先在这里强调一下 IOC 不是 Spring 提出来了,在 Spring 之前就已经有人提出了 IOC 思想,只不过在 Spring 之前都是偏理论化没有一个具体的落地方案,Spring 在技术层面把 IOC 思想体现的淋漓尽致。
什么是 IOC(Inversion of controller)
- IOC 是一种思想,而不是一个技术的实现。
- 主要的描述是在软件开发的领域对象的创建和管理的问题。
- 上述我们了解了传统的开发模式,我们再来看看如果有 IOC 的思想下程序员是如何使用对象的。
从上图可知:
- 程序员只需要告诉 IOC 自己需要那个 Bean。就不需要关系该 Bean 创建的细节已经该 Bean 的相关依赖。这一切 IOC 容器已经帮你做好了。
- 凡事有得必有失: 这个过程中我们失去了创建 Bean 的权利。
- 了解了基本的使用后,有人说 IOC 就是控制反转,讲到这里你还没将控制反转?好!别急接下来就是细讲我们常说的控制反转。
控制反转
在理解控制反转之前我们首先要清楚控制是指什么? 反转又反转了什么?
- 控制: 指的就是我们上述说的我们失去的权利(创建对象的创建,或者说控制对象的权利)
- 反转: 指的是控制权的转变。在没有 IOC 的容器上我们程序员想创建谁就创建谁的权利。在 IOC 容器下程序员就只能委屈巴巴的向 IOC 容器索取对象。创建对象的权利由程序员到 IOC 容器手里了。
IOC 解决了什么问题?
- 其实就是解决了对象之间的耦合问题。
- 我们不需要在通过 New 关键字来创建对象,而是从容器中获取达到一种松耦合的目的。
- 同时 IOC 容器也方便管理容器内的所有 Bean 对象。所谓的 Bean 的生命周期。
IOC 和 DI 的区别
将到 IOC 肯定会有人想到 DI(Dependancy Injection)依赖注入,那这两者有什么不同和相同呢?
相同点
- IOC 和 DI 描述的都是同一件事情(对象的实例化以及维护对象与对象已经的依赖关系)
不同点
- 首先 IOC 是一种思想,而 DI 是一种具体的技术实现手段。
- IOC 是站着对象的角度上对象的实例化以及管理从程序员的手里交给了 IOC 容器
- DI 是站着容器的角度的上会把对象的依赖的其他对象注入到容器中,上述案例中的 A 类依赖 B 类 IOC 容器不仅仅将 A 类放到容器中还需要将其依赖的 B 类也一并加载到 IOC 容器中。
如何自定义实现一个 IOC 容器
- 小伙伴们看到这里其实对 IOC 容器已经有了一定的了解。那如果在面试的过程中面试官问你如何实现一个自定义的 IOC 容器。你可以讲出的具体思路嘛? 可以先想一想在继续往下看,看看是不是和自己的想法不谋而合。
- 思路大致如下所示:
- 想必大家都有自己的一定的理解,可能做法比较简单,但是对于理解 IOC 容器而已其实已经足够了。如果想更加准确或者深入了解其底层实现,可以按照这个思路去看 Spring 的相关源码实现,相信你一定会得心应手。
小案例
- 我们通过一个小案例来写我们的 IOC 容器
- 我们经常购物,我们可以把购物简单的理解成下单和减库存两个操作。
- 有同学会问为什么要写这个案例啊,不仅为了我们能够理解 IOC 容器也为了我们后续的文章将 AOP 和 AOP 的经典实现事务控制铺垫的。
Coding
- 首先整体的代码结构很简单,在这里也说明一下
- Bean 的配置文件
- 创建 Bean 对象”工厂“进行创建
- 主要就是读取 xml,通过 set 方法传值。
- 业务代码
- 启动
- 测试 地址: http://localhost:9080/order?userId=857&name=ipone
配图:
作者:后端学长
链接:https://juejin.im/post/5eb022e7f265da7bb46bcd9d
总结
以上是生活随笔为你收集整理的抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 当Tomcat遇上Netty,我这一系列
- 下一篇: Spring 异步调用,一行代码实现!舒