IoC与DI的介绍

传统代码的耦合度

首先,我们来看下面的代码片段:
image

在上述代码左侧中,我们创建了业务层的实现类,创建数据层的接口并给出数据层的实现类,之后我们使用bookDao接口调用了save()方法,右侧为数据层的实现类。
然而,传统写法是存在很大缺陷的,主要表现在耦合度较高。所谓耦合度,简单来说就是对象之间的依赖程度。在上述代码中,目前我们使用的是BookDaoImpl实现类,如果以后我们换了一套实现类,即BookDaoImpl2,那么在左侧中我们原本的new BookDaoImpl()要相应地改成new BookDaoImpl2(),对于大型项目来说,我们就要修改原代码,并重新编译,重新测试,重新部署,重新发布,这样的一系列操作都是有相应成本的。究其原因,就是因为我们在类里面写了其他类的实现,从而导致代码的耦合度偏高。

Ioc思想的提出

IoC不是一门技术,而是一个思想。IoC,(Inversion of Control,控制反转)。既然传统代码耦合度过高是因为我们在类中写了其他类的实现,那么,我们在使用对象时可以在代码中不去主动使用new来产生对象,而是转换为由“外部”来为我们提供对象。这样做的目的是为了解耦合。即通过某种手段使我们可以在代码中将写法变为下面这样:
image
当我们的代码中不包含其他对象的创建代码时,当某实现类更改后,我们不需要对现有代码进行更改,这样自然就解决了高耦合的问题。Spring框架实现了IoC思想,它为我们提供了容器(IoC容器)用来充当IoC思想中的“外部”。
总结:

  • IoC(Inversion of Control)依赖注入
    • 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想成为控制反转
  • Spring框架实现了IoC思想
    • Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
    • IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称Bean
DI(Dependency Injection)

IoC容器中含有许多个bean,主要为×××Dao或×××Sercice,当我们需要使用×××Sercice时,若IoC容器只将该service对象提供给我们,程序仍无法运行,因为该service的运行需要dao,此时就需要进行依赖注入。
image

上面已经提到,dao对象和service对象都在IoC容器中,因此当service依赖dao时,IoC先帮助我们实现两者之间的依赖关系,之后再将service对象提供给我们,这个过程就叫做依赖注入。DI的目的就在于将代码充分解耦,最终效果为当我们使用对象时,不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。

posted @ 2024-06-16 19:49  平生三伏时  阅读(18)  评论(0)    收藏  举报