Spring IOC(一) 依赖注入
作者:互联网
要弄清楚SpringIOC的原理是什么,首先要弄清楚为什么需要他。我们对Spring IOC最多的描述就是控制反转、依赖倒置,所以这里就要先了解一下什么事控制反转和依赖倒置。
我们知道,类与类之间存在调用关系,一个类会依赖另一个,调用另一个类的方法或属性去完成某一件事,这也是类的单一职责和模块化设计要求。简单举个例子来说,设想这样一个简单场景:
一个国家要发生战争,国王要派遣将军去打仗,首先是将军这个类,他能打仗,所以可以简单定义为:
然后是国王类,国王类重点在于下达命令给将军,然后让将军去打仗,所以国王必须要持有将军这个类:
这里通过构造器,在国王类中新建将军类,然后让将军类取执行打仗的任务。
然后来看测试类,让国王执行下发打仗命令:
看上去很正常,完全满足需求。但是仔细想想,一个只有一个国王,但可能只有一个将军吗,假如王国里还有个将军叫General2,下次国王想派遣General2去打仗,基于以上的代码该怎么办,只能修改国王类:
这样就可以了,但是你想想,王国有这么多的将军,难道每一次派一个将军去打仗,难道每次我都要对国王类进行修改吗,所以以上明显不是个很好的办法。
这样做的弊端在于,将军类的实例化放在了国王类里面,将军类与国王类耦合太大,以至于要修改将军类,就必须修改国王类。
所以我们调整一下思路,以上的思路其实也是我们常遇见的,当一个类中需要其他类的是后,就自己主动NEW一个出来使用。所谓依赖倒置,就是说当我需要这个类的时候,不用自己去new了,交给第三方,通过第三方创建好你所需要的类,然后拿给你。
回到刚才的场景,在国王类里面,我们就不自己创建将军类了,我们将将军类通过国王的构造器,从外部传进来:
可以看到,这里的将军类不是自己创建的,是通过国王类的构造器传进来的,再来看看测试类:
将军类从外部先建立,然后在传入国王类,当我想要换一个将军的时候,由外部创建不同的将军类,然后传入,这样就不需要修改国王类了,达到了解耦的效果。
好了,现在我们来把这个过程完善一下:
首先是将军类General和General2,由于是同种类型,所以定义一个接口,不同将军类只要实现General这个接口就行了:
每个将军打仗方式不一样,所以方法里面对应各自的实现,然后是国王:
注意这里构造器传入的是个接口,不指定哪个将军,在需要的时候再从外部进行注入,即为下面的情况:
在外面传入,只需要构造需要的将军,传入国王里面就可以了。
这就是一个简单的依赖注入,总的来说,不用类自己来new对象,有第三方创建为你后注入,减少对象之间的耦合。SpringI IOC也是基于这个原理来进行设计的。
下一篇文章简述一下spring是怎么进行注入的,这里只是将功能实现,源码的话。。。。。等我先掌握了再写吧,毕竟源码对我这种初学者来说,还是有点困难的。
标签:依赖,一个,Spring,将军,打仗,然后,IOC,国王 来源: https://blog.csdn.net/qq_35218521/article/details/103946828