IOC(控制反转)

news2024/11/18 22:27:28

目录

理解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.coloradmin.cn/o/563073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

容器部署 redis 哨兵集群 【问题笔记】

目录 1.哨兵模式 (sentinel) 启动时报错:Cant resolve instance hostnames 2.哨兵模式下 master 节点崩掉后无法切换从节点为master节点 1.哨兵模式 (sentinel) 启动时报错:Cant resolve instance hostna…

Axure教程—单色折线图(中继器)

本文将教大家如何用AXURE中的中继器制作单色折线图 一、效果介绍 如图: 预览地址:https://d84rfm.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87814278 二、功能介绍 简单填写中继器内容即可动态显示值样…

Call for Papers丨第十一届全国社会媒体处理大会,AI Open设独立专刊投稿渠道

全国社会媒体处理大会(SMP)专注于以社会媒体处理为主题的科学研究,为传播社会媒体处理最新的学术研究与技术成果提供广泛的交流平台,旨在构建社会媒体处理领域的产学研生态圈,成为中国乃至世界社会媒体处理的风向标。 …

2023年了PWA开发模式在国内还有发展空间吗?

随着国内外技术及生态的迅猛发展,应用程序的开发模式也在不断演进。在过去,就我及身边同事的经验而言,会常常需要在不同的平台(如Android、iOS)编写不同的代码,导致开发成本和维护困难的问题。 然而&#…

WBS项目分解的7大基本原则

制定和分解WBS,需要遵循的基本原则: 1、唯一性 每一项工作任务在WBS中是唯一的。 WBS项目分解的7大基本原则 2、负责制 每一项任务都需要明确责任人,一人负责,其他人参与。 3、可测量性 每一项任务都应该是可以量化和测量的&#…

5月份招了个00后测试堪称卷王之王,让人崩溃...

前段时间公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司干了三年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&am…

非流式语音合成和流式语音合成

语音合成技术:https://zhuanlan.zhihu.com/p/113282101 流式语音合成技术揭秘与实践 1、非流式语音合成,一次性输入文字,一次性输出语音,注重语音合成系统的 整体运算速度 ,不适合做语音交互;流式语音合成…

如何在 Linux Mint 21 上安装 VirtualBox 7?

VirtualBox 是一款开源的虚拟化软件,它可以让你在一台计算机上同时运行多个操作系统。本文将详细介绍如何在 Linux Mint 21 上安装 VirtualBox 7。以下是安装过程的详细步骤: 步骤一:下载 VirtualBox 7 首先,你需要下载 VirtualB…

姜春宇:数据治理五大发展趋势

4月27日在2023数据治理新实践峰会上,大数据技术标准推进委员会副主席姜春宇先生以《数据治理发展趋势》为主题为大家分享了数据的价值和最新发展趋势。 以下为姜春宇先生的演讲实录,为了方便阅读,小编做了一些字句修改和文本优化。 大家上午…

如何在 OpenSUSE 上安装 VirtualBox 7?

VirtualBox 是一款开源的虚拟化软件,允许用户在单个计算机上运行多个操作系统。本文将详细介绍如何在 OpenSUSE 上安装 VirtualBox 7。以下是安装过程的步骤: 步骤一:下载 VirtualBox 7 首先,我们需要下载 VirtualBox 7 的安装包…

从火灾演习中认识火灾以及火灾发生时如何确保消防设备的正常运行

安科瑞虞佳豪 火光、浓烟、热浪……5月10日,在宁波高新区光华路119号一座废弃厂房内,一场特殊的“火灾”正在发生! 据悉,宁波市消防部门组织开展了一场真人真火的火灾实验。目的是为了让人们直观感受火灾的危险,进一…

vcruntime140_1.dll丢失怎样修复,推荐4个vcruntime140_1.dll丢失的修复方法

vcruntime140_1.dll文件是Microsoft Visual C Redistributable for Visual Studio 2015运行库的一部分,它是一个用于支持Visual C构建的应用程序的系统文件。这个文件包含了在运行C程序时所需要的函数和类库,主要负责向应用程序提供运行时环境。如果电脑…

布隆过滤器和布谷鸟过滤器

过滤器使用场景: 比如有如下几个需求: 1.原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?   解决办法一:将10亿个号码存入数据库中,进行数据库查询&…

听说小破站新上一批“高质量”的视频,于是怀揣着“学习”的目的,我用Python将他们全部采集了下来

事情是这样的,昨晚室友悄咪咪的拉着我去他的电脑,说带我欣赏一点高雅的作品,于是这一坐下,便是一晚上… 作为一个乐于分享的博主,本来我是决定直接分享的,但是转念一想,授人以鱼不如授人以渔&am…

如何看待 30 岁学云计算,转行做云计算运维这件事?

作为IT培训行业的从业人员,30岁学云计算转行不算什么的,还有38岁想学云计算的呢!最主要的是个人兴趣和意向,当然这个年龄阶段还会考虑的一点就是目前的收入与家庭支出的问题。不过这位38岁的“大龄”学员学习的主要目的不是说去找…

不是吧,交换机坏了你还只会这么排查?

又见面了,我的网工朋友 上次给你分享了交换机和路由器的对接上网配置案例,还记得吗? 今天这篇,和你聊聊交换机接口故障。 接口故障这件事,对咱们网工来说其实算是家常便饭了。 工作到现在,你复盘一下&a…

卷积、相关、匹配滤波、脉冲压缩以及模糊函数

文章目录 【 1. 卷积 】连续卷积离散卷积 【 2.相关 】自相关互相关 【 3.匹配滤波 】滤波器模型有色噪声 时滤波器的特性白噪声 时滤波器的特性 【 4.脉冲压缩】时域脉冲压缩频域脉冲压缩 【 5.模糊函数 】【 6.四者之间的关系 】相关和卷积之间的关系 【 7.参考文献 】 【 1.…

day10 - 使用canny算子进行人像勾勒

本期主要介绍canny算子,了解canny算子的流程以及各个流程的原理和实现。 ​ 完成本期内容,你可以: 了解canny算子的流程和应用 若要运行案例代码,你需要有: 操作系统:Ubuntu 16 以上 或者 Windows10 工…

Kubernetes(k8s)集群安装部署

一. 环境说明 名称IP系统配置主控节点192.168.136.11Rocky9.22核4G工作节点1192.168.136.12Rocky9.22核4G工作节点2192.168.136.13Rocky9.22核4G 二. 系统先决条件配置(所有节点) 2.1 关闭防火墙 防火墙可能会导致重复的防火墙规则和破坏kube-proxy,…

如何编写一个测试方案?---她是这样做的!

1、背景 工作上的项目规范要求:测试排期大于3D的项目要编写测试方案。调研了部分同学的情况,在此流程规范要求的基础上,对于需求的逻辑复杂或技术实现复杂等情况也会准备测试方案。 我个人主要负责OMS系统测试,它是整个履约流转中…