网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
什么是 IoC?
IoC = Inversion of Control 翻译成中⽂是 “控制反转” 的意思。
也就是说 Spring 是⼀个 “控制反转” 的容器。
首先,明确一点:控制反转,是两个词 >> 控制 和 反转。
所谓的控制反转,指的是:
之前程序的控制权限是在我们自己手上,现在,我们把这个控制权交出去了。通俗来说:宝物易主了,这个东西不再属于旧主人,而是属于新主人的。
一般情况下,我们在 A 类 中,想去调用 B 类中的方法,是怎么做的?
是不是 要去new B 类对象,通过 对象 去调用 B类中的方法。
当前 B 的控制权,是我们手上的。
而 控制反转,就是将我们手上的权限,交由 “其他人” 来操作这个类。
这个“其他人”,就是 Spring 框架。
此时,我们想要 A 类中调用 B 的时候, 告诉 框架,我要在 A 中 调用 B 了。
至于 B 的生命周期,和我们没有任何关系。
这是控制反转。
前面说过: Spring 是一个 控制反转 的 容器。
也就是 像之前在传统开发的时候,所有需要我们自己去new东西,都不需要我们再去new 了。
因为我们把控制权 “反转给了” Spring 框架。
Spring 会帮我们管理所有的对象(Bean)在 Spring 中,我们管 对象,叫做 Bean。
当我们想要在一个类中,调用另外一个类,就只需呀声明一下就可以拿到它了。
这就是一个 IoC 容器的定义.
下面,我们通过举一个例子,来加深 对 IoC 的理解。
传统程序的开发
假如,我们现在构建⼀辆“⻋”的程序,我们的实现思路是这样的
上诉的这种 解耦操作,就是运用 IoC 思想。
将 创建类的对象,以及传参的权限,交由“其它人”,自己不再插手其中。
只是在使用的时候,告诉 容器 需要使用某某对象,然后容器就把对应的对象给我们。
最后,我们拿着对象直接使用即可。
至于 对象什么时候创建,几个参数?都不需要我们去操心。
修改起来,也非常简单!
你改了哪个类,你就只针对那个类进行修改就行了。
其它程序,不会受到任何影响!!!
总结
由此,不难得出结论。
IoC 的优点:
1、实现代码的解耦合,使用代码之间互不影响。
2、对象(Bean)的生命周期,交给 IoC 框架来维护,作为程序员无需再关注了。这个 帝乡 什么 new的,什么时候不用了,被回收。
都不需要我们去关注了!
这都被 IoC 容器 给一手包办了!!!
举个例子:下馆子 VS 在家自己DIY
如果我们自己在家做一道菜,我们需要买菜,洗菜,jian菜;另外,我们还需要准备柴米油盐;最后,还要进行一些列的操作,才能做出一道菜。
但如果是下馆子,你只需要跟老板说 想吃什么。
然后,我们就什么都不用管了!等着老板端上来就行了!
需要我们做什么吗?完全不用!
我们可以玩玩手机,甚至溜达一圈。
菜上来了,直接吃就行了。
这不就是 IoC 思维,将 做饭的权限 交由 其他人 来负责。
我们不需要再去关注过程,直接享用结果即可!
理解 Spring IoC
回到我们的主题:
4Spring,本⽂刚开始咱们就讲:"Spring 是包含了多个⼯具⽅法的 IoC 容器,这就是对 Spring 最核⼼的总结。“
集成多个⼯具⽅法”这事咱们以后慢慢再讲.
既然理解了 容器 与 IoC 的意义。
那如何理解“Spring 是⼀个 IoC容器”这句话呢?我们可以直接认为 Spring 就是一个 IoC 容器。
既然它是一个容器,那么,容器主要的两个核心功能,肯定是具有的!
1、装东西:
那些被 控制反转 的对象(Bean),都可以存储在 Spring 中。
2、取东西
作为一个容器,不可能只存不取吧?
将 对象(Bean),从 Spring 中 取出来。
这也是 Spring IoC 容器 最核心的两个功能【存 和 取 】。接下里,要讲的内容都是围绕 存 和 取,这两个字来进行的!
对于我们程序员来说,操作 Spring,最最核心的两件事,就是 存 和 取。
初级目标
存:将 Bean(反转的对象),存入 Spring 中。
取:从 Spring 中,取出 Bean(对象)
高级目标
将 Bean(对象)的存取过程,简化,
让其易用性更强!
学习 Spring,就是学习 如何更简单的 进行 存取 操作。
DI
在 讲完了 IoC 的定义之后,我们不得不提一下 Spring 的 另一个定义:DI。
DI 和 Spring 就是 “天生一对”!之前也说过 Spring 和 IoC 也是“天生一对”!
这么说吧:谈到IoC,Spring 是绝对不能少的!
而谈到 Spring,DI 是必不可少的!就好像讲三国演义,离不开刘备。
而谈到刘备,就离不开诸葛亮!
毕竟 刘备的大业,和 诸葛亮 有着莫大的关联,
IoC,Spring 和 DI 之间的关系,也就是如此。DI: dependency Injection(依赖注入)
dependency,这个词,相信大家并不陌生!
就是我们 在 pom.xml 中 引入依赖的时候,需要用到的标签。
dependency Injection(依赖注入)
依赖,好理解。
在执行 B 的时候,需要用到 A 类,不然 B 类 无法往下继续执行。
此时,就可以认为 B 类 是 依赖于 A 类的。
那么,注入 是什么意思呢?
就是将一个东西 拿过来用,就是注入。
合起来,DI 的意思,就是 引入的依赖,直接拿过来用。
更严格来说:
所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。
所以,依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。
IoC 和 DI,在广义角度上,都是一回事!这个时候,就会有一个问题,并且,还是一个非常经典的面试题!
IoC 和 DIIoC 是一种思想,而 DI 是一种实现。
假设,我们有一天心情非常好!
决定下班之后,吃顿好的。
这就是一种思想.
但是!我们有说要吃什么吗?
很明显是没有的!
IoC,就是这样的。
我把权限交由 Spring,当我需要使用某个对象的时候,直接向它要。
这哥对象怎么给我的,我不管注!
我只关注:是否能拿到这个对象。
而 DI 就是一个具体实现:我准备下班去吃海底捞。
此时,吃什么,是不是就明确落实了!
吃海底捞,就是具体的实现。
DI 关注于 怎么将 依赖 注入 对应的对象里面。
IoC 和 DI 之间的关系,就好比多线程进阶中的 乐观锁 和 CAS 之间的关系。
乐观锁:认为进行加锁操作之后,没有那么容易就会发生锁冲突。【思想】
CAS:compare and swap(比较 与 交换)【具体实现】
确保 该操作 的原子性。数据在操作的过程中不会其它线程访问和修改。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
763117763)]
[外链图片转存中…(img-UdYLyLjX-1715763117764)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!