首页 > 其他分享 >spring——控制反转(IoC)—— 与 ——依赖注入(DI)

spring——控制反转(IoC)—— 与 ——依赖注入(DI)

时间:2022-12-10 15:24:18浏览次数:52  
标签:容器 依赖 Java DI 对象 spring Spring IoC

控制反转(IoC)

 

 

在传统的 Java 应用中,一个类想要调用另一个类中的属性或方法,通常会先在其代码中通过 new Object() 的方式将后者的对象创建出来,然后才能实现属性或方法的调用。

 

 

为了方便理解和描述,我们可以将前者称为“调用者”,将后者称为“被调用者”。

 

 

也就是说,调用者掌握着被调用者对象创建的控制权。

 

但在 Spring 应用中,Java 对象创建的控制权是掌握在 IoC 容器手里的,其大致步骤如下。

  1. 开发人员通过 XML 配置文件、注解、Java 配置类等方式,对 Java 对象进行定义,例如在 XML 配置文件中使用 <bean> 标签、在 Java 类上使用 @Component 注解等。
  2. Spring 启动时,IoC 容器会自动根据对象定义,将这些对象创建并管理起来。这些被 IoC 容器创建并管理的对象被称为 Spring Bean。
  3. 当我们想要使用某个 Bean 时,可以直接从 IoC 容器中获取(例如通过 ApplicationContext 的 getBean() 方法),而不需要手动通过代码(例如 new Obejct() 的方式)创建。

 

 


IoC 带来的最大改变不是代码层面的,而是从思想层面上发生了“主从换位”的改变。

 

原本调用者是主动的一方,它想要使用什么资源就会主动出击,自己创建;但在 Spring 应用中,IoC 容器掌握着主动权,调用者则变成了被动的一方,被动的等待 IoC 容器创建它所需要的对象(Bean)。


这个过程在职责层面发生了控制权的反转,把原本调用者通过代码实现的对象的创建,反转给 IoC 容器来帮忙实现,因此我们将这个过程称为 Spring 的“控制反转”。

 

 

 

 

IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。


Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。


IoC 容器是 Spring 框架中最重要的核心组件之一,它贯穿了 Spring 从诞生到成长的整个过程。

 

 

 

 

 

 

 

 

依赖注入(DI)

 

在了解了 IoC 之后,我们还需要了解另外一个非常重要的概念:依赖注入。


依赖注入(Denpendency Injection,简写为 DI)是 Martin Fowler 在 2004 年在对“控制反转”进行解释时提出的。

 

Martin Fowler 认为“控制反转”一词很晦涩,无法让人很直接的理解“到底是哪里反转了”,因此他建议使用“依赖注入”来代替“控制反转”。

在面向对象中,对象和对象之间是存在一种叫做“依赖”的关系。简单来说,依赖关系就是在一个对象中需要用到另外一个对象,即对象中存在一个属性,该属性是另外一个类的对象。

例如,有一个名为 B 的 Java 类,它的代码如下。

  1. public class B {
  2. String bid;
  3. A a;
  4. }

 


从代码可以看出,B 中存在一个 A 类型的对象属性 a,此时我们就可以说 B 的对象依赖于对象 a。而依赖注入就是就是基于这种“依赖关系”而产生的。

我们知道,控制反转核心思想就是由 Spring 负责对象的创建。在对象创建过程中,Spring 会自动根据依赖关系,将它依赖的对象注入到当前对象中,这就是所谓的“依赖注入”。

依赖注入本质上是 Spring Bean 属性注入的一种,只不过这个属性是一个对象属性而已。

 

 

 

 

 

 

 

 

 

IoC 的工作原理

 

在 Java 软件开发过程中,系统中的各个对象之间、各个模块之间、软件系统和硬件系统之间,或多或少都存在一定的耦合关系。

 


若一个系统的耦合度过高,那么就会造成难以维护的问题,但完全没有耦合的代码几乎无法完成任何工作,这是由于几乎所有的功能都需要代码之间相互协作、相互依赖才能完成。

 

 

因此我们在程序设计时,所秉承的思想一般都是在不影响系统功能的前提下,最大限度的降低耦合度。

 


IoC 底层通过工厂模式、Java 的反射机制、XML 解析等技术,将代码的耦合度降低到最低限度,其主要步骤如下。

  1. 在配置文件(例如 Bean.xml)中,对各个对象以及它们之间的依赖关系进行配置;
  2. 我们可以把 IoC 容器当做一个工厂,这个工厂的产品就是 Spring Bean;
  3. 容器启动时会加载并解析这些配置文件,得到对象的基本信息以及它们之间的依赖关系;
  4. IoC 利用 Java 的反射机制,根据类名生成相应的对象(即 Spring Bean),并根据依赖关系将这个对象注入到依赖它的对象中。

 

 


由于对象的基本信息、对象之间的依赖关系都是在配置文件中定义的,并没有在代码中紧密耦合,因此即使对象发生改变,

我们也只需要在配置文件中进行修改即可,而无须对 Java 代码进行修改,这就是 Spring IoC 实现解耦的原理。

 

 

 

 

 

 

 

 

==============================================================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IoC 容器的两种实现

IoC 思想基于 IoC 容器实现的,IoC 容器底层其实就是一个 Bean 工厂。Spring 框架为我们提供了两种不同类型 IoC 容器,它们分别是 BeanFactory 和 ApplicationContext。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

ApplicationContext的3个实现类:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BeanFactory和ApplicationContext的区别

 

标签:容器,依赖,Java,DI,对象,spring,Spring,IoC
From: https://www.cnblogs.com/xiaobaibailongma/p/16971618.html

相关文章

  • spring——Spring Bean定义
          在XML配置的<beans>元素中可以包含多个属性或子元素,常用的属性或子元素如下表所示。属性名称描述idBean的唯一标识符,SpringIoC容器对Bean......
  • 1236. Decoding Task
    1236.DecodingTaskhttps://acm.timus.ru/problem.aspx?space=1&num=1236 思路对于带空格串加密结果,第一个字符61,K1K2XOR32=61,可以算出K1K2对于原始串加密结......
  • SpringBoot内置tomcat启动过程及原理
    作者:李岩科1背景SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,同时也提供了很多便捷的功能,比如内置tomcat就是其中一项,他让我们省去了搭建tomca......
  • spring——第一个spring案例
    Spring是什么(理解) Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IoC(InverseOfControl:反转控制)和AOP(AspectOrientedProgramming:面向切面编程)为内核......
  • pytest:ERROR: usage: run_tests.py [options] [file_or_dir] [file_or_dir] [...]
    写了一个框架,运行的时候报错,提示:ERROR:usage:run_tests.py[options][file_or_dir][file_or_dir][...]run_tests.py:error:unrecognizedarguments:--reruns1-......
  • elasticsearch global 、 filters 和 cardinality 聚合
    1.背景此处将单记录一下global、filters和cardinality的聚合操作。2、解释1、globalglobal聚合是全局聚合,是对所有的文档进行聚合,而不受查询条件的限制。global聚......
  • springcloud Config 分布式配置中心
     Server端:提供配置⽂件的存储、以接⼝的形式将配置⽂件的内容提供出去,通过使⽤@EnableConfigServer注解在Springboot应⽤中⾮常简单的嵌⼊Client端:通过接⼝获取配置数据......
  • springcloud Stream消息驱动
    SpringCloudStream是⼀个构建消息驱动微服务的框架。应⽤程序通过inputs(相当于消息消费者consumer)或者outputs(相当于消息⽣产者producer)来与SpringCloudStream中的bind......
  • springcloud Sleuth 链路追踪
    1.分布式链路追踪技术核⼼思想下图描述了⼀个常⻅的调⽤场景,⼀个请求通过⽹关服务路由到下游的微服务-1,然后微服务-1调⽤微服务-2,拿到结果后再调⽤微服务-3,最后组合微服务-......
  • springcloud GateWay网关
    GateWay如何工作客户端向SpringCloudGateWay发出请求,然后在GateWayHandlerMapping中找到与请求相匹配的路由,将其发送到GateWayWebHandler;Handler再通过指定的过滤器链......