目录
一:代码书写现状
二:核心思想
一:代码书写现状
常规操作如上,但存在着问题,将项目上线后,需要将数据层进行更换,更换如下:
数据层更换后,业务层也需要进行更换,更换如下:
数据层和业务层的代码都进行了更换,那么源码也需要重新编译,重新测试,重新部署,重新发布,这些工作重新进行,那么成本也是会增加的,这些原因终究只有一条:由于我们在类里面进行了其他方法的实现,导致代码的耦合度提高。我们代码编写的原则就有一条,要追求低耦合。所以,在这里存在着一个问题,这里的耦合度过高,我们要想办法把这里的耦合度减小,既然是在业务层中编写代码将耦合度提高的,那么我们不如在这里不写,来将耦合度减小,实现代码如下:
如上所示,耦合度是减小了,但是存在着问题:只存在着接口,一运行的话,那么就会报异常,NullPointerException异常,没有实现对象,那么我们要让程序运行怎么办,这里不就是没有实现对象而导致异常,你不就是要一个对象吗?你不要写对象了,我直接给你一个对象不就能让程序运行了嘛,这就是使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象思想,这样的问题解决方案思想被称为IOC( Inversion of Control):控制反转, 对象的创建控制权由程序转移到外部,这种思想称为控制反转
二:核心思想
lOC思想
Inversion of Control, 控制反转, 强调的是原来在 程序中创建Bean的权利反转给第三方。
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
- 问: 这种思想与Spring有什么关系呢?
- 答:Spring技术对 lOC思想进行了实现
Spring将这种思想给完成实现了,怎么做到的呢?其实也就是Spring提供了一个容器,称为IOC容器,用来充当IOC思想的"外部"。
原来代码写法:
现在代码写法:
IOC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean
如图所示,IOC容器帮我们将service和dao层创建好了后,代码能成功运行起来吗?答案是不行,因为service的运行是依赖于dao的
既然serviec是依赖于dao来运行的,巧了的是service与dao都是在IOC容器中的,那么IOC容器就帮你将service和dao之间的依赖关系给绑定好,也就是这个dao对象,IOC容器直接给你,让你的程序能直接运行,这种思想称为DI思想:
Dependency Injection, 依赖注入, 强调的Bean之 间关系,这种关系第三方负责去设置。
在容器中建立Bean与Bean之间的依赖关系的整个过程,称为依赖注入
介绍完 Spring 的 IOC 和 DI 的概念后,我们会发现这两个概念的最终目标就是 : 充分解耦 ,具体实现依靠 :
-
使用IOC容器管理bean(IOC)
-
在IOC容器内将有依赖关系的bean进行关系绑定(DI)
最终效果:
- 使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系