IOC控制反转理解

article/2025/11/6 21:53:03

1. IOC基础

IOC:全称Inversion Of Control,中文翻译是控制反转的意思。初学Spring绕不过去的一个弯,需要好好理解IOC的思想。网上看了很多博客,也看了很多网课,但是还是云里云雾。终于看到一个容易理解的例子,写下自己对IOC的理解。


2. IOC推导与理解

首先编写一个基本的项目,结构如下:

  1. 有一个Meizi(妹子)接口,里面有一个方法describe。

  2. 编写四个类(四种类型的妹子):Yujie(御姐)、Luoli(萝莉)、Xuemei(学妹)、NvWang(女王)类实现Meizi接口,重写describe方法。

  3. 一个Nan(男生)接口,里面有一个方法getMeizi。

  4. 编写两个类:yihao(一号男生)、erhao(二号男生)实现Nan接口,重写getMeizi方法。

为了简单方便将所有的类实现都放在一个代码块中,这里利用男生找对象的方式进行理解IOC的含义。


2.1、最基本的实现方式
interface Meizi {public void describe();
}class Yujie implements Meizi{@Overridepublic void describe() {System.out.println("御姐~");}
}//这里只列出一种女生类型的具体实现,其他的类似interface Nan {public void getMeizi();
}class yihao implements Nan{@Overridepublic void getMeizi() {Meizi meizi = new Yujie();meizi.describe();}
}class erhao implements Nan{@Overridepublic void getMeizi() {Meizi meizi = new Yujie();meizi.describe();}
}

在这里插入图片描述
现在整个实现是上图所示,getMeizi方法内部依赖四种类型的妹子。

  1. 很容易看到这种设计方式违背了OOP的设计原则,至少违背了迪米特法则。我们不应该将一个陌生类(接口)作为局部变量!

  2. 没有改动的余地,现在男生都想找一个御姐对象,如果需求变更男生想找一个女王呢?是不是需要更改所有男生的代码?


2.2、采用组合的方式实现

假设男生最开始都有一个御姐类型的女朋友

interface Meizi {public void describe();
}class Yujie implements Meizi{@Overridepublic void describe() {System.out.println("御姐~");}
}//这里只列出一种女生类型的具体实现,其他的类似interface Nan {public void getMeizi();
}class yihao implements Nan{private Meizi meizi = new Yujie();@Overridepublic void getMeizi() {meizi.describe();}
}
class erhao implements Nan{private Meizi meizi = new Yujie();@Overridepublic void getMeizi() {meizi.describe();}
}
public class Main {public static void main(String[] args) {yihao man1 = new yihao();			man1.getMeizi();erhao man2 = new erhao();man2.getMeizi();}
}

在这里插入图片描述
采用组合关系之后如上图,现在真正的问题来了:

  1. 组合关系:什么是组合关系?谁也离不开谁、二者之间是一个整体;比如:脑袋和身体这种关系;叫组合关系。

  2. 男一号、男二号能保证自己以后一定会跟御姐妹子走到最后吗?或者说二者之间一定不会分手吗?组合关系限定死了男一号、男二号更换对象的权利,他们没有权利在更换对象了!当然御姐妹子也没有权利更换男朋友了!

  3. 如果想跟换对象是需要重新去修改源代码,重新new一个对象。

  4. 这个代码设计也不好,男生、女生都丧失了更换对象的权利。耦合度太高了,硬生生的将两个人绑在了一起。


2.3、采用聚合方式(松耦合)

组合方式限定死了男生的对象、没有办法更换。现在将组合方式改为聚合,不在内部直接new一个确定的对象(主动创建)。而是通过set方法给男生一个女朋友(被动接受)。

interface Meizi {public void describe();
}class Yujie implements Meizi{@Overridepublic void describe() {System.out.println("御姐~");}
}//这里只列出一种女生类型的具体实现,其他的类似interface Nan {public void getMeizi();
}class yihao implements Nan{private Meizi meizi;public void setMeizi(Meizi meizi) {this.meizi = meizi;}@Overridepublic void getMeizi() {meizi.describe();}
}
class erhao implements Nan{private Meizi meizi;public void setMeizi(Meizi meizi) {this.meizi = meizi;}@Overridepublic void getMeizi() {meizi.describe();}
}public class Main {public static void main(String[] args) {yihao man1 = new yihao();man1.setMeizi(new Yujie());man1.getMeizi();erhao man2 = new erhao();man2.setMeizi(new Luoli());man2.getMeizi();}
}

在这里插入图片描述
通过set注入方式就可以实现解耦。

  1. 假定IOC是一个婚介所,现在男女生都婚介所登记资料,男生告诉IOC需要什么样的对象,IOC就给男生一个。

  2. 由男生主动搭讪妹子寻找对象(new),演变成了被动的由婚介所介绍对象(set注入)!

  3. 到此IOC就是大概一个这样的概念:控制反转,反转的是创建对象的方式,由主动化为被动的一个过程。

3. IOC总结

在这里插入图片描述
控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring的IOC容器来创建的

反转 : 程序本身不创建对象 , 而变成被动的接收对象 .


http://chatgpt.dhexx.cn/article/2gaiH6Ww.shtml

相关文章

C# IoC控制反转学习笔记

一、什么是IOC IoC-Invertion of Control,即控制反转,是一种程序设计思想。 先初步了解几个概念: 依赖(Dependency):就是有联系,表示一个类依赖于另一个类。 依赖倒置原则(DIP&a…

spring -- 控制反转IOC

1.IOC的理论背景 在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统地业务逻辑。 图1 软件系统中耦合的对象 齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间…

Java:控制反转

Java中自带的函数或对象都是编写软件的时候写的,当它需要调用你自己编写的数据的时候,它如何又不知道你定义的类(对象)是什么,里面有什么成员,它无法调用你的代码,这个时候就需要用到控制反转了…

IoC控制反转

IoC控制反转 一、IoC概念和原理1. 什么是IoC2. IoC底层原理 二、IoC过程1. xml配置文件,配置创建的对象2. 有UserService和UserDao类,创建工厂类 三、IoC接口1. IoC思想基于IoC容器完成,IoC容器底层就是Bean工厂2. Spring提供实现IoC容器的两…

IOC 控制反转

文章目录 一.IOC概念二. IOC的体现三.ioc的技术实现三.基于XML的DI1.引用类型属性自动注入 四.包含关系的配置文件五.基于注解的DI五.简单类型的属性赋值1.vaule(简单类型的属性赋值)2.自动注入 一.IOC概念 IOC:控制反转,是一个理论&#xf…

浅谈控制反转(IoC)

Inversion of Control 什么是控制反转? 程序的流程控制权相对于传统的面向过程编程而言发生了反转。下面是维基百科的描述 In software engineering, inversion of control (IoC) is a programming principle. IoC inverts the flow of control as compared to tr…

Spring---浅谈IOC

概念 IOC(Inversion of Control 控制反转)是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。 传统开发模式与IOC开发模式的对比 传统开发模式:对…

控制反转-Inversion Of Control

一、控制反转 控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专业术语。它包括依赖注入(Dependency Injection,简称DI&#xff…

微信小程序hamburgers汉堡包css动画

微信小程序hamburgers汉堡包css动画 源码在我的csdn里下载 https://download.csdn.net/download/ozhy111/12201373

汉堡式折叠html,美味的CSS动画汉堡包:hamburgers_html/css_WEB-ITnose

s if you insist, but they’re not accessible as a menu button. Append the class name of the type of hamburger you’re craving: Here’s the list of hamburger-type classes you can choose from: hamburger--arrowhamburger--arrow-rhamburger--arrowalthamburger--a…

LSB 题解

今天来刷一道Misc的题目,LSB原理进行图片隐写 LSB原理 LSB是一种利用人类视觉的局限性设计的幻术 PNG和BMP图片中的图像像素一般是由RGB(RED红 GREEN绿 BLUE蓝)三原色组成 记住,JPG图片是不适合使用LSB隐写的,JPG图片对像数进行了有损压缩…

LSB利器-zsteg

一、Usage # zsteg -h Usage: zsteg [options] filename.png [param_string] -c, --channels X channels (R/G/B/A) or any combination, comma separated valid values: r,g,b,a,rg,bgr,rgba,r3g2b3,... -l, --limi…

【linux】lsb_release -a命令

查看linux发行版本:lsb_release -a 运行该命令时若提示lsb_release命令不存在 不存在,则表明系统未安装该命令,报错如下: 解决方法: 查看 lsb_release 命令属于哪个软件包,命令为yum provides */lsb_rel…

图片LSB隐写(java)

一、隐写原理 LSB隐写原理就是图片中的像素一般是由三种颜色组成,即三原色(红绿蓝)。由这三种原色可以组成其他各种颜色,在png图片的存储中,每个颜色占有8bit,即有256种颜色,一共包含256的三次方颜色,即16777216中颜色。人类的眼睛…

LSB隐写术

前言 LSB全称为 least significant bit,是最低有效位的意思。Lsb图片隐写是基于lsb算法的一种图片隐写术,以下统称为lsb隐写,这是一种常见的信息隐藏方法。当然关于图像的隐写的方法有很多,统称为隐写术, lsb隐写很实…

Linux开发标准LSB简介:Linux Standard Base

目录 Unix/Linux 标准化历史 POSIX Open Group Austin Group LSB LSB 简介 组织架构 工作组 LSB 的标准化流程 认证 认证问题报告 LSB 的历史、现状和将来 实例:lsb_release 的规范定义和实现 结束语 Unix/Linux 标准化历史 标准化目前已经成为 Linu…

LSB 简介

Unix/Linux 标准化历史 标准化目前已经成为 Linux 系统上的一个热门话题。实际上,在 Linux 诞生之初,这个问题就得到了重视。当 Linus 在开发 0.01 版本的 Linux 内核时,就开始关注 POSIX 标准的发展,他在 /include/unistd.h 文件…

图片隐写之LSB(Least Significant Bit)原理及其代码实现

1. 什么是隐写? 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganogra…

MetaPhlAn2:宏基因组物种组成分析

简介 MetaPhlAn2是分析微生物群落(细菌、古菌、真核生物和病毒)组成的工具,它在宏基因组研究中非常有用,只需一条完命令即可获得微生物的物种丰度信息(扩增子物种组成需要质控、拼接、拆样本、切除引物、比对等步骤,此软件居然分析宏基因组这…

你想要的宏基因组-微生物组知识全在这(2023.4)

欢迎点击上方蓝色”宏基因组”关注我们! 宏基因组/微生物组是当今世界科研最热门的研究领域之一,为加强宏基因组学技术和成果交流传播,推动全球华人微生物组领域发展,中科院青年科研人员创立“宏基因组”公众号,联合海…