首页 > 其他分享 >IOC之依赖注入和控制反转

IOC之依赖注入和控制反转

时间:2023-06-25 18:24:27浏览次数:46  
标签:依赖 反转 材料 private Cook 注入 IoC IOC

依赖注入(DI,Dependency Injection)是IoC的一种实现方式,它指的是将一个对象作为参数传入另外一个对象(或者通过接口的方式注入),以实现这个对象之间的依赖关系。这种方式让被注入对象不需要关心自己依赖的其他对象的实现细节,从而实现松耦合。控制反转(IoC,Inversion of Control),是一种设计原则和编程思想,它实现了依赖注入和依赖查找。将原本由调用方决定的调用顺序和参数初始化等控制,交给IoC容器来控制。这种方式让对象之间的依赖关系反转了,即由IoC容器来控制对象的生命周期和依赖关系,使得程序更具灵活性、可扩展性、可维护性和可测试性。总的来说,DI和IoC都是为了实现对象之间的松耦合而设计的。DI更加关注对象的依赖关系,而IoC更加关注对象的管理和控制。依赖注入是IoC的一种实现方式,而IoC则是一种更为抽象的、基于依赖注入实现的更为通用的设计原则。通过IoC和DI的组合,在软件设计和开发中能够更加高效地完成对对象间复杂关系的管理。

好的,那我举个例子来说明。

想象一下你正在做一道菜,需要用到一些材料和调料,这些材料和调料就好比是对象,而做菜的过程就是程序的执行过程。在传统的面向对象编程中,假设我们要在做菜的过程中使用到五种材料 A、B、C、D、E,那么我们可能需要这样写代码:

public class Cook {   private MaterialA a;   private MaterialB b;   private MaterialC c;   private MaterialD d;   private MaterialE e;   public Cook()   {     this.a = new MaterialA();     this.b = new MaterialB();     this.c = new MaterialC();     this.d = new MaterialD();     this.e = new MaterialE();   }   public void cook()   {   // 使用材料 A、B、C、D、E 做菜的过程   } } 在这段代码中,我们可以看到 Cook 类中依赖了五种材料,Cook 类自己负责了这些材料的初始化、使用和管理,这样会造成以下问题:
  • 如果 Cook 类依赖的材料太多,那么 Cook 类的构造函数会变得非常臃肿;
  • 如果要修改其中某个材料的实现方式,那么 Cook 类的代码会变得非常复杂,需要同时修改 Cook 类和该材料的实现类并保证无误;
  • 如果要重用其中某个材料,比如让其他的菜也可以使用材料 A,那么就需要将其从 Cook 类中剥离出来,这样会造成重构的麻烦。
那么,如果使用依赖注入和控制反转的方式来做菜呢?我们可以将每种材料封装成一个实体类,然后将这些材料交给一个 IoC 容器去管理,在 Cook 类中通过依赖注入的方式将需要的材料注入到 Cook 类中,形象的来说就是 Cook 类向 IoC 容器“要”这些材料。这样做菜的代码就变成了这样: public class Cook {   private MaterialA a;   private MaterialB b;   private MaterialC c;   private MaterialD d;   private MaterialE e;   public Cook(MaterialA a, MaterialB b, MaterialC c, MaterialD d, MaterialE e)   {     this.a = a;     this.b = b;     this.c = c;     this.d = d;     this.e = e;   }   public void cook()   {   // 使用材料 A、B、C、D、E 做菜的过程    } }

在这个例子中,我们只需要将需要的材料通过构造函数注入到 Cook 类中,而不需要 Cook 类自己去初始化和管理这些材料,从而实现了对象之间的松耦合,并且能够更好地支持测试和维护。

IoC 容器则负责管理对象的生命周期和依赖关系,如果要修改其中某个材料的实现方式,只需要在 IoC 容器中修改即可,如果要重用某个材料也很方便,只需要将其在 IoC 容器中注册一下即可。

这样,我们就实现了依赖注入和控制反转,使得代码更加清晰、简洁和易于维护。

标签:依赖,反转,材料,private,Cook,注入,IoC,IOC
From: https://www.cnblogs.com/UsefulIdiot/p/17503652.html

相关文章

  • 记录一个在写项目中遇到的Maven依赖无法导入的问题
    记录一个在写项目中遇到的Maven依赖无法导入的问题项目是一个父项目做依赖管理,三个子项目,今天遇到一个问题:子项目中导入的依赖,怎么都导入不进去,maven仓库中已经有了,idea提示也没有问题,如图:可以看到,idea提示是正常的,依赖都是继承自父项目,但是左边的依赖中没有我导入的这些依赖,......
  • 简单实现的一个依赖注入框架 (.Net Core7)
    根据Microsoft.Extensions.DepdencyInjection框架简单仿写的一个DI框架。官方地址:https://github.com/dotnet/runtime/tree/main/src/libraries/Microsoft.Extensions.DependencyInjection测试示例;usingMyDI.Core;ServiceCollectionsc=newServiceCollection();sc......
  • 11.springboot 原理 ( 起步依赖-自动配置)
    springboot原理springframeworkspringboot(配置起步依赖-自动配置)spring-boot-starter-web起步依赖(其他依赖自动传递)自动配置原理:自动将内置类存入IOC容器中,不用收到配置,只能扫描包内即子包的类,可以指定扫描的包内容:@ComponentScan("com.alex","com.ite");@Import导......
  • 8. IOC & DI注解开发管理第三方bean
    ‍1.注解开发管理第三方bean‍在上述环境中完成对​Druid​数据源的管理,具体的实现步骤为:步骤1:导入对应的jar包<dependency>  <groupId>com.alibaba</groupId>  <artifactId>druid</artifactId>  <version>1.1.16</version></dependency>步骤2:在......
  • 7. IOC & DI注解开发
    要想真正简化开发,就需要用到Spring的注解开发,Spring对注解支持的版本历程:2.0版开始支持注解2.5版注解功能趋于完善3.0版支持纯注解开发关于注解开发,我们会讲解两块内容​注解开发定义bean​和纯注解开发​。注解开发定义bean用的是2.5版提供的注解,纯注解开发用......
  • 5. IOC DI配置管理第三方bean
    1.1案例:数据源对象管理在这一节中,我们将通过一个案例来学习下对于第三方bean该如何进行配置管理。以后我们会用到很多第三方的bean,本次案例将使用咱们前面提到过的数据源​Druid(德鲁伊)​和C3P0​来配置学习下。1.1.1环境准备学习之前,先来准备下案例环境:创建一......
  • ElasticSearch依赖(7.12.1)【ElasticSearch】
    <!--ES依赖--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><!--忽略掉冲突的依赖-->......
  • 鲍威尔一句话,BTC冲破30000!币圈涨跌不再依赖美联储降息?
       仅仅一夜,全球最大的加密货币比特币价格突破30000美元关键阻力位,最高突破至30800美元,创2023年4月以来的最高价。而美联储主席鲍威尔的证词,竟是这波行情的最大催化剂。   鲍威尔周三出席众议院金融服务委员会接受质询,当他回应议员MaxineWaters询问稳定币发行商是否应该获得......
  • 3. IOC相关内容
    1.bean相关配置‍对于bean的配置中,主要会讲解​bean基础配置​,bean的别名配置​,bean的作用范围配置​(重点),这三部分内容:1.1bean基础配置(id与class)bean标签的功能如图:​​‍这其中需要大家重点掌握的是:bean标签的id和class属性的使用。思考:class属......
  • SpringCloud依赖问题:spring-cloud-starter-eureka-server 和 spring-cloud-starter-ne
    学习SpringCloud微服务时,很多资料上都写的是spring-cloud-starter-eureka-server,结果问题无法正常启动,这是因为与当前的SpringBoot版本不匹配。其实较新的版本应该使用spring-cloud-starter-netflix-eureka-server依赖。PS:SpringCloud的版本不兼容好坑。......