Spring3之控制反转(IOC)

news2024/11/24 4:34:30

简介

控制反转(Inversion of Control, 缩写为IoC), 是面向对象编程中的一种设计原则, 可以用来减低计算机代码之间的耦合度;其中最常见的方式叫做依赖注入(Dependency Injection, 简称DI), 还有一种方式叫 “赖查找” (Dependency Lookup); 通过控制反转, 对象在被创建的时候, 由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它; 也可以说, 依赖被注入到对象中

理论背景

在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统地业务逻辑;如下图展示了软件系统中耦合的对象;如同一个齿轮组一样,如果有一个齿轮出了问题,那么整个系统就会出现问题

在这里插入图片描述
耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间;如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一;为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson 1996 年提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中
在这里插入图片描述

什么是 IOC

IOC 是 Inversion of Control 的缩写,多数书籍翻译成 “控制反转”
1996 年, Michael Mattson 在一篇有关探讨面向对象框架的文章中, 首先提出了IOC 这个概念; 对于面向对象设计及编程的基本思想, 前面我们已经讲了很多了, 不再赘述, 简单来说就是把复杂系统分解成相互合作的对象, 这些对象类通过封装以后, 内部实现对外部是透明的, 从而降低了解决问题的复杂度, 而且可以灵活地被重用和扩展; IOC理论提出的观点大体是这样的: 借助于 “第三方” 实现具有依赖关系的对象之间的解耦; 如下图展示了 IOC 解耦过程

在这里插入图片描述
由于引进了中间位置的"第三方", 也就是IOC容器, 使得 A、B、C、D 这4个对象没有了耦合关系, 齿轮之间的传动全部依靠 “第三方” 了, 全部对象的控制权全部上缴给 “第三方” IOC 容器, 所以, IOC容器成了整个系统的关键核心, 它起到了一种类似"粘合剂"的作用, 把系统中的所有对象粘合在一起发挥作用, 如果没有这个"粘合剂", 对象与对象之间会彼此失去联系, 这就是有人把 IOC 容器比喻成 “粘合剂” 的由来

如果把上图中间的IOC容器拿掉,然后再来看看这套系统

在这里插入图片描述
现在看到的画面, 就是我们要实现整个系统所需要完成的全部内容; 这时候, A、B、C、D 这 4 个对象之间已经没有了耦合关系, 彼此毫无联系, 这样的话, 当你在实现A的时候, 根本无须再去考虑 B、C 和 D 了, 对象之间的依赖关系已经降低到了最低程度; 所以, 如果真能实现 IOC 容器, 对于系统开发而言, 这将是一件多么美好的事情, 参与开发的每一成员只要实现自己的类就可以了, 跟别人没有任何关系!
我们再来看看, 控制反转(IOC)到底为什么要起这么个名字?我们来对比一下, 软件系统在没有引入 IOC 容器之前, 如图1所示, 对象 A 依赖于对象 B, 那么对象A在初始化或者运行到某一点的时候, 自己必须主动去创建对象B或者使用已经创建的对象 B; 无论是创建还是使用对象 B, 控制权都在自己手上;
软件系统在引入 IOC 容器之后, 这种情形就完全改变了, 由于 IOC 容器的加入, 对象A与对象B之间失去了直接联系, 所以, 当对象 A 运行到需要对象 B 的时候, IOC 容器会主动创建一个对象 B 注入到对象 A 需要的地方; 通过前后的对比, 我们不难看出来:对象 A 获得依赖对象 B 的过程,由主动行为变为了被动行为, 控制权颠倒过来了, 这就是"控制反转"这个名称的由来。

IOC 也叫依赖注入(DI)

2004 年, Martin Fowler 探讨了同一个问题, 既然 IOC 是控制反转, 那么到底是"哪些方面的控制被反转了呢?“, 经过详细地分析和论证后, 他得出了答案: “获得依赖对象的过程被反转了”; 控制被反转之后, 获得依赖对象的过程由自身管理变为了由IOC容器主动注入; 于是, 他给"控制反转"取了一个更合适的名字叫做"依赖注入(Dependency Injection)”; 他的这个答案, 实际上给出了实现IOC的方法: 注入; 所谓依赖注入, 就是由IOC容器在运行期间, 动态地将某种依赖关系注入到对象之中; 所以, 依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情, 就是指通过引入 IOC 容器, 利用依赖关系注入的方式, 实现对象之间的解耦

Bean 的 Scope
scope 共有 5 种模式, 如果没有配置 scope 的话, 默认是 singleton(单例模式)
singleton: 单例模式, 默认, 只会创建一个实例
prototype: 多例模式, 每次请求都会创建一个新的实例
request: 每一次 HTTP 请求都会产生一个新的 bean, 同时该bean仅在当前 HTTP request 内有效
session: 每一次 HTTP 请求都会产生一个新的 bean, 同时该bean仅在当前 HTTP session 内有效
global session: 类似于标准的 HTTP Session 作用域, 不过仅在基于 portlet 的 web 应用中有意义

在这里插入图片描述
什么时候需要使用单例或多例呢,简单的区别方式就是 这个类中的属性如果会变的话,就要使用多例,如果属性不会改变,就可以使用单例

比如在 UserAction(Struts2) 类中 User 对象是会改变的,所以要使用多例,否则在调用 add() 的时候,最后一次 add 操作会覆盖之前的 user 对象

在这里插入图片描述

注入配置方式

  1. 通过 getter 和 setter 方式注入

在这里插入图片描述
2. 在类中添加构造函数,然后通过构造函数方式注入
在这里插入图片描述
构造函数添加 IUserService
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344111.html

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

相关文章

CData Drivers for Acumatica

CData Drivers for Acumatica Acumatica的CData驱动程序为用户提供了使用AcumaticaERP数据的便捷途径,该数据来自商业智能、分析、定制应用程序、报告以及ETL。通过JDBC、ADO.NET和ODBC等标准驱动程序,以及与PowerShell、Power BI、Excel、SSIS等流行应用…

java微信小程序音乐播放器分享系统

随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,音乐播放器小程序被用户普遍使用,为方便用户能够可以随时进行音乐播放器小程序的数据信息管理,特开发了基于音乐播放器小程序…

计算之变:联想问天给中国智能IT基础设施划下新起点

“冥昭瞢暗,谁能极之?冯翼惟象,何以识之?”屈原在《天问》中喊出了心中的困惑,用无数个问题,展现了中国人对世界的探索精神和好奇心。人对时空无限性的追问,伴随的是对有限性的焦灼感。幸好&…

JZ50、JZ57、JZ56

文章目录JZ50 第一个只出现一次的字符题目描述:具体实现:JZ57 和为S的两个数字题目描述:具体实现:JZ56 数组中只出现一次的两个数字题目描述具体实现:JZ50 第一个只出现一次的字符 题源 👉 第一个只出现一…

在线预览PDF文件、图片,并且预览地址不显示文件或图片的真实路径。

实现在线预览PDF文件、图片,并且预览地址不显示文件或图片的真实路径。1、vue使用blob流在线预览PDF、图片(包括jpg、png等格式)。1、按钮的方法:2、方法详细:(此方法可以在发起请求时携带token&#xff0c…

Data2Vec:视觉、语音和语言的语境化目标表征的高效自监督学习

Efficient Self-supervised Learning with Contextualized Target Representations for Vision, Speech and Language (视觉、语音和语言的语境化目标表征的高效自监督学习) 论文:efficient-self-supervised-learning-with-contextualized-t…

【Hello Linux】Linux工具介绍 (gcc/g++ gdb)

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具gcc/g 以及gbd Linux工具介绍gcc / ggcc / g的作用为什么语言要经过这四步才能变为可执行指令gcc / g语法预处理编…

机器学习强基计划8-1:图解主成分分析PCA算法(附Python实现)

目录0 写在前面1 为什么要降维?2 主成分分析原理3 PCA与SVD的联系4 Python实现0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型&#xf…

MATLAB | 情人节来绘制更立体的玫瑰花吧

又是一年情人节,今年带来一款更有立体感的玫瑰: 曲面的函数表达式来自: http://www.bugman123.com/Math/index.html 这个网站,上面还有很多其他帅气的玩意。 基础绘制 xlinspace(0,1,300); thetalinspace(-2*pi,15*pi,300); [x,theta]meshg…

【历史上的今天】2 月 14 日:第一台通用计算机面世;IBM 成立;Julia 公开发布

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 2 月 14 日,在 1819 年的今天,打字机和第一台 QWERTY 布局键盘的发明者克里斯托弗肖尔斯(Christopher Sholes)出…

API文档自动生成工具

一、参考资料 从Python源码注释,自动生成API文档 二、问题引入 不管是开源还是闭源,要让所有人都能读懂你的代码这太难了,所以文档是很重要的。大部分情况,我们不希望维护一份代码再加上一份文档,这样做很容易造成文…

Springboot扩展点之InitializingBean

前言InitializingBean这个扩展点,其实在Springboot扩展点之BeanPostProcessor中已经简单有所涉及,而这篇文章的将重点分析其功能特性、实现方式和工作原理。功能特性1、Spring中提供了InitializingBean接口,帮助用户实现一些自定义的初始化操…

为什么学了模数电还是看不懂较复杂的电路图

看懂电路并不难。 (1) 首先要摆正心态,不要看到错综复杂的电路图就一脸懵逼,不知所错。你要明白,再复杂的电路也是由一个个的基本电路拼装出来的。 (2) 基础知识当然是少不了的,常用的基本电路结构搞搞清楚。 (3) 分析电路之前先要…

Unity通俗易懂的讲解PPU(Pixel Per Unit)与Camera Size

目录 前言 Unity的一个单位 Camera Size Pixel Per Unit的具体含义 前言 unity 2d中的sprite ,具有一个参数:Pixel Per Unit 初学者往往不知道这个代表什么意思,如何理解,怎么设置,这个在unity的美术素材的使用也…

DynamicPDF HTML Converter for .NET 1.9 Crack

.NET HTML 到 PDF 转换库,快速将 HTML 转换为 PDF,转换为文件或字节数组,多线程性能 DynamicPDF Converter for .NET is a .NET API that allows developers to dynamically convert many common file formats to PDF documents in real-time. Converter supports converting …

使用Cifar10训练DenseNet121

DenseNet默认就是DenseNet-BC, 相对于resnet,densenet权重参数更少,鲁棒性更强. 0、下载数据集:Cifar-10在同级文件data下 预训练权重: densenet121: https://download.pytorch.org/models/densenet121-a639ec97.pth…

C++ 之基本数据类型(整型、布尔型及字符型)

文章目录参考描述数据类型整形有符号无符号规则sizeof 运算符进制cout 的自动转换(进制)后缀验证溢出主动权溢出布尔型变量判断结果字符型ASCII细节范围参考 项目描述菜鸟教程数据类型搜索引擎GoogleC Primer Plus (第六版)中文版…

深度学习目标检测_YOLOV4超详细解读

文章目录一. 前言yolov4的创新点2.1 输入端的创新2.1.1数据增强2.1.2自对抗训练(SAT)2.2BackBone创新Dropblock标签平滑损失函数IOU LossGIOU LossDIOU LossCIOU Loss一. 前言 作者AlexeyAB大神! YOLOv4 拥有43.5%mAP65FPS ,达到…

C语言(利用函数将字符串转换为数字和数子转换字符串)

目录 1.atoi(字符串转换为int类型) 2.atof(字符串转换为float类型) 3.atol(字符串转换为long类型) 4.strtol(字符串转换为long类型,但可以选择转换的进制,以及标记结束字符地址) 5.strtod(字符串转换为double类型,可以标记结束字符地址) 6.整数和浮点数转换为…

项目进度经常超时怎么办?项目经理如何有效管理项

当项目延期,我们要先找根因,再根据根因制定具体针对性措施。如果是故障,第一时间是以修复问题为主,然后去找原因,最终给出对应的措施。 对于项目进度,那首先要去了解延期的原因,是计划制定的不…