Spring入门之IOC

IOC/DI:

Spring最核心的灵魂,IOC/DI(控制反转/依赖注入)!,这里一定要理解他,理解这个思想。我会细说什么是IOC/DI、他的思想是什么、它带来了那些好处。

 

进入正题,先说说什么是ioc,什么又是DI,其实ioc 与 DI 本质上是一个东西,但是他们的概念有所不同,Spring公司称之ioc,民间有部分人称它为DI。

 

ioc(控制反转)

       什么叫控制反转,先从字面上的意思来思考,谁控制谁、控制什么、谁又反转谁、反转是什么。

                    

     下面4点我会简单的说明下,如果不明白的先记住这些话,后面会慢慢的讲解

 

1.谁控制谁?

角色:Spring框架、应用程序(项目)

角色分别是Spring框架、应用程序,在控制反转中,是Spring框架控制着应用程序。

 

2.控制什么?

Spring框架控制应用程序,具体是控制应用程序的什么? 控制着应用程序对资源的管理(创建对象、对象的关系依赖、给对象属性设置字符串、文件等等,这些都称之为资源)。

 

3.谁反转谁?

Spring反转应用程序对资源的管理。

 

4.什么是反转?

什么是反转,有反转就有正转,正转是什么,我们在应用程序(项目)里面new 对象 、给对象赋值 、给对象做关系依赖(这些行为我统称对资源的管理),这些行为都叫正转,而反转就是反过来,这些事情都交给其他人去做,应用程序本身不做了,这就是反转。

 

 把上面4点总结起来就是,Spring控制应用程序对资源的管理,这就是控制反转。

 

    

IOC思想:

       Spring真正厉害的地方,是它的思想,并不是它的代码,是它这种思想改变了开发的格局,它把以前应用程序对资源的管理给分离出来,全部交给Spring ioc做,提高了开发的效率,让我们专注于业务逻辑及其他方面,不需要去管对象的创建、关系的依赖,想要什么从Spring ioc获取,同时还做到了松散耦合,比如修改对象的依赖关系,特别是对象比较多,关系也比较复杂的情况,如果还是传统的方法,都由应用程序管理资源,那么维护成本会很高,你需要修改大量的代码,降低开发效率,换成是Spring ioc来修改关系,直接在配置文件里面配置即可,应用程序几乎不需要改动代码,下面我会通过画图的形式来讲解思想的演变,你们能更深的体会我说的这些内容与它的思想。

 

思想的演变

思想1:

 Spring入门之IOC

 

 

这就是正转,任何事情全部由应用程序本身操作,对象的创建、对象的关系依赖、获取外部资源、业务的逻辑,全部混在一起,如果里面的对象多,关系也复杂,维护起来,时间成本非常高,降低我们开发效率,也容易出现bug,而且每次都要重新编译。

 

 

思想2:

 Spring入门之IOC

 

现在由思想1的正转变成了反转,以前由应用程序中A类做的资源管理(对象的创建、对象的关系依赖、获取外部资源),交给了对象工厂去做,所有的资源都向对象工厂获取,由之前的主动去创建对象、配置关系依赖、获取外部资源,全部变成了被动接收,对象工厂成为了主动,这些东西全是对象广场给你的,但是这样还是不方便,因为你要更换对象还是要去修改工厂CreateC()里面具体创建对象的代码,同样要重新编译。

 

思想3:

 Spring入门之IOC

 

思想3演变成了,工厂获取XML里面配置好的类的全限定名再用反射创建对象,以后要修改对象,直接修改配置文件即,不需要改动代码,也不会重新编译,此时的关系是,应用程序A类被动接收,依赖工厂类,工厂类也变成被动接收,依赖xml配置文件,xml配置文件变成了主动,但是操作起来比较麻烦,比如带参构造器、依赖关系等等,用反射做会十分麻烦。

 

思想4:

            

 Spring入门之IOC

 

思想4正是现在的讲的IOC,其实IOC的底层原理就是工厂+xml+反射,只不过Spring把他们全部封装的很完善,扩展了很多东西,不需要我们去做任何有关操作对象的事情,只要在XML里面配置好对象的关系即可,Spring会自动帮你创建好,应用程序尽管获取就醒了,现在的关系演变成了,应用程序被动接收,依赖Spring,Spring依赖XML配置文件,XML配置文件主动,需要改变对象修改配置文件即可,与思想3相比,少了加载xml配置文件再通过反射去创建对象的步骤,这些事情Spring全部帮你做好了。

上图的请求流程是 启动项目的时候Spring会去获取XML配置文件里面的关系,再通过反射技术把他们都实例化,并装进ioc容器内,应用程序获取的时候直接问Spring要,Spring从ioc容器中取出来给应用程序。

 

思想总结:

             整个思想的演变,最大的变化就是主动变被动,这是IOC最核心的思想,由应用程序主动管理这些资源演变成Spring来管理,应用程序依赖Spring来获取资源变成被动,Spring来管理这些资源变成了主动。

 

 

 

IOC与DI

 

IOC与DI讲的是同一件事情,但是角度不一样

 

1.应用程序角度:

应用程序依赖Spring,依赖Spring给它注入资源,这就是依赖注入DI。

2.Spring角度:

Spring控制应用程序,控制它对资源的管理,这就是控制反转IOC。