IOC(控制反转)

news/2025/1/31 7:46:50/

目录

理解IOC

理解IOC容器

Spring IOC

IOC优点

什么是依赖注入DI

DI是如何实现的呢?

总结 :

IOC实现的基本过程

容器如何放入Bean对象?

IOC实现的基本过程

IoC容器在Spring的实现


理解IOC

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

  • 谁控制谁 ,控制什么 :

传统设计 : 直接在对象内部通过new 进行创建对象,程序主动依赖创建的对象.

IOC : 由IOC容器来控制对象的创建

谁控制谁 : IOC容器控制了对象

控制什么? 主要控制了外部资源获取(不只是对象也包括文件).

  • 为什么是反转,哪些方面反转

正转 : 传统应用程序由我们主动控制去直接获取依赖对象

反转 : 由容器来创建及注入依赖的对象

为什么是反转 ? 容器帮我们查找及注入依赖的对象,对象只是被动地接受依赖对象.

哪些方面反转了 ? 依赖对象的获取被反转了.

理解IOC容器

对于上面APP这个类就相当于是一个IOC容器

这个容器可以自动的对你的代码进行初始化,你只需要维护一个Configuration(可以是一个XML,可以使一段代码),不用每次初始化一辆车都要亲自去写一大堆初始化的代码 ,--->进行管理Java Bean从创建到销毁的过程

Spring IOC

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

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

  • 控制反转是一种思想。
  • 控制反转是为了降低程序耦合度,提高程序扩展力。
  • 控制反转,反转的是什么?
    • 将对象的创建权利交出去,交给第三方容器负责。
    • 将对象和对象之间关系的维护权交出去,交给第三方容器负责。
  • 控制反转这种思想如何实现呢?
    • DI(Dependency Injection):依赖注入

对于 Spring IOC 而言呢.以前是需要在对象的内部自己去创建,而IOC是交给spring去创建,也就是说所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转.

IOC优点

传统应用程序都是由我们在类的内部主动创建依赖对象,从而导致类与类之间的高耦合.

IOC容器,把创建和查找依赖对象的控制权都交给了容器,由容器来注入组合对象,对象与对象之间耦合度降低. 方便测试,功能复用,使得整个体系结构变得非常灵活.

就比如 :

传统 : 应用程序是老大,想获取什么资源都是主动出击.

IOC :应用程序变为被动,被动地等待IOC容器来创建并注入它所需要的资源了.而不是对象主动去创建依赖的资源,

节省系统资源和提高程序的性能,spring IOC 是单例的,spring IOC采用的是懒汉模式,第一次调用这个类的时候我才去加载和初始化,就永远放在内存中,当其他类以后第2,3,....次用这个类的时候,不需要从新去进行类加载了,可以直接使用这个类,就不会有多个对象,不需要在用的时候再去new了.

什么是依赖注入DI

所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中

依赖注入 就是在程序运行的时候由IOC容器动态的将我所依赖的对象加入到当前类中的过程

  • 谁依赖于谁 : 应用程序依赖于IOC容器
  • 为什么需要依赖 : 应用程序需要IOC容器来提供对象所需要的外部资源
  • 谁注入谁 : IOC容器注入应用程序依赖的对象
  • 注入了什么 : 注入某个对象所依赖的外部资源(包括对象,资源,常量数据...)

就比如A对象要操作数据库,就需要一个Connection对象,有了spring就会告诉spring,我需要connection对象,至于这个connection资源怎么进行构造,什么时候构造,A不需要进行关心,在程序运行的时候,spring就会制造一个connection,然后向打针一样,注射到A当中. 完成了各个对象之间的控制.

Connection由spring注入到A当中的,所以为依赖注入

通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

DI是如何实现的呢?

Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

总结 :

依赖注入:

  • 依赖注入 就是在程序运行的时候由IOC容器动态的将我所依赖的对象加入到当前类中的过程

依赖注入常见的实现方式包括三种:

  • 第一种:属性注入
  • 第二种:set注入
  • 第二种:构造注入

所以结论是:IOC 就是一种控制反转的思想, 而 DI 是对IoC的一种具体实现。

Bean管理说的是:Bean对象的创建,以及Bean对象中属性的赋值/属性的注入过程(或者叫做Bean对象之间关系的维护)

IOC实现的基本过程

容器如何放入Bean对象?

通过一个Map集合来放入JavaBean.

为什么使用Map集合 : 最重要的是因为它是以key-val键值对进行存储的.

IOC实现的基本过程

  • 首先我们通过XML配置/注解的方式,告诉IOC我们要创建什么样的对象让IOC给我创建并且返回,接着就会通过一个抽象/接口BeanDefinitionReader进行加载,这个接口有不同的实现类,根据不同的方式进行不同的加载,把加载好的Bean的定义信息放到IOC容器中,IOC先对Bean的定义信息(这个Bean的定义信息还可以进行修改)进行实例化,在Spring中是通过BeanFactory+反射的方式进行实例化,然后在对 对象进行初始化,得到最终的对象.我们可以通过context.getBean()方法去得到IOC容器中的对象.

  1. 将对象的创建权利交出去,交给第三方容器负责。
  2. 将对象和对象之间关系的维护权交出去,交给第三方容器负责。

IoC容器在Spring的实现

IOC具体在Spring中的实现是通过BeanFactory工厂这个接口

BeanFactory是IOC的最基本实现

①BeanFactory

这是 IoC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。

②ApplicationContext

我们要用的是BeanFactory的子接口也就是 ApplicationContext

BeanFactory 的子接口,提供了更多高级特性,有不同的实现类。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。

这个ApplicationContext接口有更高级更强大的功能

类型名

简介

ClassPathXmlApplicationContext

通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象

FileSystemXmlApplicationContext

通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象

ConfigurableApplicationContext

ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。

WebApplicationContext

专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

参考 :

尚硅谷视频

关于IOC的一些博客

控制反转_百度百科

IOC 控制反转[通俗易懂]-腾讯云开发者社区-腾讯云

Spring系列第2篇:控制反转(IoC)与依赖注入(DI) - 知乎

浅析控制反转 - 知乎

浅谈控制反转与依赖注入 - 知乎


http://www.ppmy.cn/news/79552.html

相关文章

C++判断大端小端

C判断大端小端 1. 基础知识 大端小端其实表示的是数据在存储器中的存放顺序。 大端模式:数据的高字节存放在内存的低地址中,而低字节则存放在高地址中。地址由小到大增加,数据则从高位向低位存放,这种存放方式符合人类的正常思维…

智慧梁场3D建模

智慧梁场3D建模:数字化革命下的新起点 ​ 随着科技的迅猛发展,数字化已经成为了现代工业生产的必然趋势。作为传统工业的核心产业,建筑行业也在不断地探索数字化变革的新路径。而“智慧梁场3D建模”便是其中的一项杰出实践。 ​ 梁场是建筑…

如何有效放松

文章目录 1. 放松懒散?2. 放松放纵?3. 放松慢下来?4. 放松自我疏导or洗脑?5. 放松逃离?附录 周末时间宝贵,如何有效放松?本文参考了史蒂夫说334期,总结了压力调节、释放焦虑的五个观点&#xf…

007、PG当中的Schema

用户与schema的对应关系 什么是schema(模式)?database —> schema —> table用户与模式的对应关系模式管理Public模式模式使用建议搜索路径查看所有对象权限: database ----> create schema, drop schema schema ---->create table ,drop table table ---->…

cuda编程学习——基础知识介绍!干货向(三)

本文主要内容为介绍CUDA编程前的一些基础知识 参考资料: 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 文章、讲解视频同步更新公众《AI知识物语》,B站:出门吃三碗饭 1:并行计算 并行程序可以分为 指令并行&#xff1…

Spring源码阅读:AOP原理

一、概述 以下便是Spring Aop的流程,下面我将一一介绍下面的各个方法。 下面是流程中的主要方法。 二、测试代码 下面我将写一个例子介绍Spring Aop的流程。 被增强类: public class MyCalculator {public Integer add(Integer i, Integer j) throw…

Python xml.dom.minidom 读取xml

之前写过sax 读取xml 具体的可以点击查看 这里试下dom 读取xml dom 读写xml的几个属性 parse 解析xml documentElement 获取根节点 nodeName 获取节点名称 nodeType 获取字节点 childNodes 获取子节点 hasAttribute 获取节点属性 getElementsByTagName 这个一般是根据…

让你在Windows打开Sketch格式再也不愁

Sketch是Macos的专用矢量绘图应用。在Sketch软件中,ios开发者可以轻松设计图层面板等图层的常用操作,广泛应用于产品的交互设计和UI设计,帮助很多设计师创作出很多优秀的作品。然而,Sketch只服务于Macos系统,这使得许多…