对控制反转和依赖注入的突然顿悟
程序员文章站
2022-06-10 14:50:14
控制反转和依赖注入的概念在网络上有大量的解释,很多都非常的详细,但对我来说过多的解释,容易把我绕来绕去,昨天听大佬的课,突然清晰地顿悟了。希望通过简单的描述,记录我的理解。 控制反转(IOC): 下面通过两张简单的图,了解一下控制反转的思想,我们假设自己现在想吃回锅肉! 首先,我们可以自己炒一道符合 ......
控制反转和依赖注入的概念在网络上有大量的解释,很多都非常的详细,但对我来说过多的解释,容易把我绕来绕去,昨天听大佬的课,突然清晰地顿悟了。希望通过简单的描述,记录我的理解。
控制反转(ioc):
下面通过两张简单的图,了解一下控制反转的思想,我们假设自己现在想吃回锅肉!
首先,我们可以自己炒一道符合自己口味的回锅肉,可以多加肉!然后我们就把它吃掉!!这种情况下回锅肉炒成什么样由我们自己控制。
ok!第二天我们又想吃回锅肉了,但是有点懒,我们选择点外卖。
这回我们叫的外卖,那么商家将回锅肉炒成什么样并不是我们能决定的,也就是回锅肉炒成什么样不是我们能够控制的,我们就是拿到外卖吃。
很明显回锅肉的控制权从自己变成了别人,这种就叫做控制反转。
在面向对象编程中,每当我们要new一个新的对象的时候,也就是我们所说的实例化对象,一般情况下都是主动new一个新的对象。在ioc思想中,我们通常把实例化的任务交给别人,也就是自己主动的实例化变为被动的实例化,自己对实例的控制权被别人替代了,即控制权反转了。我们一般将实例化的任务交给ioc容器统一管理生命周期。
依赖注入(di):
依赖注入是实现控制反转思想的一种方式,其想法就是在对象或属性被初始化的时候,将它所需要的依赖从外部注入进来,并不需要自己内部实例化依赖。
我们通过一段代码(go语言)来看看为什么注入的依赖符合控制反转的思想。
type player struct { name string } type gameroom struct { player *player } //这里我们就将gameroom依赖的player从外部注入进来 //player的实例化也交给了外部,所以对于player的控制权反转了。 func newgameroom(player *player) *gameroom { return &gameroom{player: player} }
很多情况下我们会使用接口注入,而接口的实例化就归外部(通常是ioc容器),不仅符合多态,更加体现了依赖倒置原则(双方都应该依赖一个抽象)。
type player interface { getname() string } type gameroom struct { player player } //player通过接口的方式注入进来,我们无须 //关系player如何实现的,这样连注入的依赖 //也变成抽象的 func newgameroom(player player) *gameroom { return &gameroom{player: player} }
这种方式好处颇多,比如更容易被单元测试、代码耦合性降低等等等等。希望这篇最简单的解释,能够使我们更快地理解ioc和di的概念。
下一篇: 面向对象编程的四大特性
推荐阅读
-
个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解
-
依赖注入(DI)和控制反转(IoC)的理解
-
控制容器的反转和依赖注入模式
-
spring-依赖注入(DI)&控制反转(Ioc)&Bean的三种装配方式
-
Spring学习笔记——一、控制反转(IOC)和依赖注入(DI)
-
【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)
-
【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)
-
控制反转( IoC)和依赖注入(DI)
-
[PHP] 控制反转依赖注入的日常使用
-
理解依赖注入和控制反转