世间万物都有因果,任何事情都不会平白无故的出现或消失。
那么首先谈一谈ioc为何出现?
简单的说就是因为面向对象编程会造成对象与对象之间的耦合,
IOC的出现就是为了解决对象之间的耦合——“解耦”。
简单介绍一下IOC
IOC(Inversion of Control)翻译为“控制反转”。
为何叫控制反转?
比如:
两个对象,对象A和对象B,对象A依赖对象B,在初始化A时,需要主动去创建对象B,控制权在自己手上。
引入IOC容器后,所以的对象由IOC容器创建,对象A和对象B失去了直接联系,解耦,在初始化A的时候,IOC容器会主动创建B注入到A需要的地方。
在对象A获得依赖对象B的时候,主动创建行为变成了被动,所以叫控制反转。
IOC还有个小名交DI(Dependency Injection)
依赖注入
DI这个名字是由IOC分析得来的。既发生控制反转之后,对象A获得依赖对象B的方式由自身创建变成了由IOC容器主动去注入,于是IOC就有了这个别名——依赖注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
再比如上面的例子:对象A依赖于对象B,当对象 A需要用到对象B的时候,IOC容器就会立即创建一个对象B送给对象A。IOC容器就是一个对象制造工厂,你需要什么,它会给你送去,你直接使用就行了,而再也不用去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全部由IOC容器包办(工厂设计模式)。
IOC依赖的技术关键:反射
反射通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象,(如今反射技术得到了很大的发展,反射生成对象的方式与正常生成对象的方式速度上的差别已经没有多少了)
有没有觉得IOC很像工厂模式中的工厂,可以粗略的把IOC看成一个工厂,工厂生成对象所需的内容都在配置文件中定义,然后用反射读取配置文件生成对象。IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。