spring IOC 通俗解释

目录

 

一、什么是IOC

IOC有个别名,叫依赖注入(DI)

为什么代码中用 new 创建对象会增加代码的耦合度

那不用 new 创建对象的话,那该如何创建对象?(答案是用注入的方式)

二、IOC实现原理


一、什么是IOC

IOC的意思是 Inversion of Control ,即控制反转。

“控制反转”,不是什么技术,而是一种设计思想。

IOC的提出是为了解决对象之间耦合程度过高的问题。

传统的软件开发的对象A,B,C,D的依赖关系强的话,就会如下图,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象,从而导致类与类之间高耦合

而IOC容器则像是对象与对象之间的“第三方”,齿轮之间的传动全部依靠“第三方”了,使得A,B,C,d这4个对象没有了耦合关系。所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

如果把中间的IOC拿掉,那么就像下图:对象A,B,C,D

可以看到,拿掉IOC容器后,各个对象(A,B,C,D)之间是基本上没有耦合的。这样的话,当你去实现A的时候,就无须考虑B,C,D。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!

 

IOC有个别名,叫依赖注入(DI)

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,指就是通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦

举个依赖注入例子:

      电脑主机读取文件的时候,它一点也不会关心USB接口上连接的是什么外部设备,而且它确实也无须知道。它的任务就是读取USB接口,挂接的外部设备只要符合USB接口标准即可。所以,如果我给电脑主机连接上一个U盘,那么主机就从U盘上读取文件;如果我给电脑主机连接上一个外置硬盘,那么电脑主机就从外置硬盘上读取文件。挂接外部设备的权力由我作主,即控制权归我,至于USB接口挂接的是什么设备,电脑主机是决定不了,它只能被动的接受。电脑主机需要外部设备的时候,根本不用它告诉我,我就会主动帮它挂上它想要的外部设备,你看我的服务是多么的到位。这就是我们生活中常见的一个依赖注入的例子。在这个过程中,我就起到了IOC容器的作用。即电脑需要什么,我就帮它注入什么,但电脑本身只能被动地接受我给它注入的东西。

 

为什么代码中用 new 创建对象会增加代码的耦合度

在传统的实现中,由程序内部代码来控制组件之间的关系。我们经常使用new关键字来实现两个组件之间关系的组合,这种实现方式会造成组件之间耦合。下面有个回答说得不错:

那不用 new 创建对象的话,那该如何创建对象?(答案是用注入的方式)

如我们定义了如下代码,Cow 和 Rabbit 类都实现了Animal接口:

Interface Animal{
void eat();
}

Class Cow implements Animal{
public void eat(){System.out.println("牛吃草");}
}

Class Rabbit implements Animal{
public void eat(){System.out.println("兔子吃草");}
}

然后使用时,如下,我们只需要维护一个 Animal类型的引用即可,下面的方法用了 setAnimal()来对 animal 进行对象的注入。这样的话,MyClass的代码逻辑就跟 Cow 和 Rabbit的代码逻辑分开,耦合程度降低。因为不管 setAnimal()传入的是 Cow 还是 Rabbit,都可以用 Animal 来表示。

Class MyClass{
private Animal animal;
public void test(){animal.eat();}
public void setAnimal(Animal a){animal = a;}
}

当然,Springboot中可以用@autowired 注解来做注入,这会更方便。如下:

Class MyClass{
@Autowired
private Animal animal;
xxx
xxx
xxx
}

二、IOC实现原理

IOC可以看作工厂模式+反射机制。我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射机制,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

IOC缺点:

由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值