IoC 思想简单而深邃

一、序言

本文跟大家聊聊 IoC 这一简单而深邃的思想。

二、依赖倒置原则

软件工程理论中共有六大设计原则:

  1. 单一职责原则:不存在多于一个的因素导致类的状态发生变更,即一个类只负责一项单一的职责。
  2. 里氏替换原则:基类出现的地方都可以用其子类进行替换,而不会引起任何不适的问题。
  3. 接口隔离原则:客户端不应该依赖于其不需要的接口,类之间的依赖关系应该建立在最小的接口之上。
  4. 迪米特法则:一个对象对其他对象有最少的了解。
  5. 开闭原则:软件设计对于扩展是开发的,即模块的行为是可以扩展的。软件设计对于修改是关闭的,即模块的行为是不可修改的。
  6. 依赖倒置原则:高层次的模块不应该依赖于低层次的模块,都应该依赖于抽象。

今天我们只讨论依赖倒置原则。上面对于依赖倒置原则的绕口令我们先暂时放下。

场景假设:一个人通过一种交通工具上下班。

  1. 若不遵循依赖倒置原则,实现方案如下:

    居住地离公司较近时:

    // 自行车类
    public class Bike {public void go() {System.out.println("骑自行车");}
    }public class Person {// 自行车private Bike bike;// 构造器public Person() {this.bike = new Bike();}// 上班public void goToWork() {bike.go();}}
    

    居住地离公司较远时:

    // 公交车类
    public class Bus {public void go() {System.out.println("乘坐公交车");}
    }public class Person {// 公交车private Bus bus; // 构造器public Person() {this.bus = new Bus();}// 上班public void goToWork() {bus.go();}
    }
    

    不遵循依赖倒置原则时,我们发现了一个巨大的问题:每换一次交通工具,Person 类几乎是重构了一遍。

  2. 遵循依赖倒置原则,实现方案如下:

    交通工具会有很多,我们将其进行一次抽象:

    // 交通工具接口
    public interface Vehicle {// 出发void go();
    }
    

    居住地离公司较近时:

    // 自行车类
    public class Bike implements Vehicle {@Overridepublic void go() {System.out.println("骑自行车");}
    }public class Person {// 此处放抽象接口private Vehicle vehicle;// 构造器public Person() {// 抽象接口的实现类是自行车this.vehicle = new Bike();}// 上班public void goToWork() {vehicle.go();}}
    

    居住地离公司较远时:

    // 公交车类
    public class Bus implements Vehicle {@Overridepublic void go() {System.out.println("乘坐公交车");}
    }public class Person {// 此处放抽象接口private Vehicle vehicle;// 构造器public Person() {// 抽象接口的实现类是公交车this.vehicle = new Bus();}// 上班public void goToWork() {vehicle.go();}
    }
    

    当我们采用依赖倒置原则实现方案时,可以发现除了构造器中需要修改,其他部分不需要做任何的修改。

现在我们重新看一下依赖倒置原则那段绕口令。高层次的模块不应该依赖于低层次的模块,即高层次模块与低层次模块应该解耦,就如同 Person 类和 Bike/Bus 类一样。如果 Person 类中直接依赖 Bike/Bus 类就会出现高耦合。都应该依赖于抽象指的是:为了解耦,高层次的模块应该依赖于低层次模块的抽象而不是具体的低层次模块。就如同 Person 类应该依赖 Vehicle 抽象接口。

三、IoC 思想

当我们遵循依赖倒置原则开发时虽然解决了大部分问题,但是我们发现依旧还存在一些问题:

public class Person {private Vehicle vehicle;public Person() {// 此处每次仍需要修改this.vehicle = new Bus();}public void goToWork() {vehicle.go();}
}

上面的问题是: Person 类依旧需要手动的创建 Bike 或 Bus 对象。有没有一种方式将这种手动的方式变成自动管理,从而进一步实现解耦呢?解决方案就是采用 IoC 思想。

IoC,全称为 Inversion of Control,中文名为“控制反转”,是一种设计思想。其核心思想是:将对象的创建权、管理权移交给容器,而不是开发人员。

Spring 已经将 IoC 思想具象化,我们以 Spring 中的 IoC 容器为例重新分析上述的例子。

// 自行车类
@Component
public class Bike implements Vehicle {@Overridepublic void go() {System.out.println("骑自行车");}
}@Component
public class Person {// 此处放抽象接口@Resourceprivate Vehicle vehicle;// 构造器public Person() {}// 上班public void goToWork() {vehicle.go();}}

从上面的代码中我们可以看出:在 Person 类中我们使用 @Resource注解将 Vehicle 对象的赋值交由 IoC 容器。容器创建 Bike 对象之后将其引用赋给了上述的 vehicle 变量。至此,对象与对象之间的完全解耦实现了。

四、IoC 思想工作流程的具象化未命名文件 (7).png

  1. 开发人员向 IoC 容器声明需要的对象
  2. IoC 容器维护所有对象之间的关系,以及对象的创建时机
  3. 开发人员需要对象时直接从 IoC 容器中获取(获取到的对象与其他对象的关系已由 IoC 容器维护好)

往期推荐

  1. JDK 动态代理
  2. ThreadLocal
  3. HashMap 源码分析(三)
  4. Spring 三级缓存
  5. RBAC 权限设计(二)

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

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

相关文章

VSCode搭建内核源码阅读开发环境

0. 参考链接 使用VSCode进行linux内核代码阅读和开发_vscode阅读linux内核-CSDN博客 1. 搭建Linux内核源码阅读环境 现状,Linux内核源码比较庞大文件非常多,其中又包含的众多的宏定义开关配置选项,这使得阅读内核源代码称为一件头疼的事。 …

常见的七种排序

目录 一、插入排序 1、直接插入排序 2、希尔排序(缩小增量排序) 二、选择排序 3、直接选择排序 4、堆排序 三、交换排序 5、冒泡排序 6、快速排序 四、归并排序 7、归并排序 五、总结 一、插入排序 1、直接插入排序 思路: i 用来…

文本溢出体验进阶:CSS 技巧实现单行/多行隐藏展示以及实际场景应用,确保内容可读性和布局整洁性

CSS文本溢出隐藏是一种常见的场景,它广泛应用于各种网页设计中,旨在确保内容的可读性和布局的整洁性,特别是在空间有限或需要适应不同屏幕尺寸的情况下。 一、文本溢出隐藏并显示省略号 1、单行文本溢出隐藏并显示省略号 对于单行文本&…

paho-mqtt 库揭秘

文章目录 **paho-mqtt 库揭秘**第一部分:背景介绍第二部分:paho-mqtt 是什么?第三部分:如何安装这个库?第四部分:库函数使用方法第五部分:场景应用第六部分:常见Bug及解决方案第七部…

Swift-25-普通函数、闭包函数与Lamda表达式编程

函数 语法定义 先来看下swift中函数的定义,函数用关键字func来指定,语法相对复杂一点,主要有下列4种基本情况,还有比较复杂的,会在后续详细讲解。 无参函数定义 有参函数定义 一个简单的函数和函数调用示例如下&…

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测 目录 分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类…

A1322 电烙铁发热芯热电偶温度与电压数据

就是这种四根线比较细的发热芯: 两根红色线是发热丝,另外两根是热电偶线,透明线是正极,不能搞错了。 非常粗略的测了一下,根本没有考虑误差。拿万用表直接测量热电偶的输出电压;用可调电源手动调节电压&am…

suse15 系统分区信息损坏修复案例一则

关键词 suse linux、系统分区fdisk、分区类型testdisk、grub2、bios There are many things that can not be broken! 如果觉得本文对你有帮助,欢迎点赞、收藏、评论! 一、问题现象 业务反馈一台suse服务器,因错误执行了fdisk分区…

Linux 服务器硬件及RAID配置实战

服务器详解 服务器分类 可以分为:塔式服务器、机架服务器、刀片服务器、机柜服务器等。 其中以机架式居多 服务器架构 服务器品牌: 戴尔、AMD、英特尔、惠普、华为、华3(H3C)、联想、浪潮、长城 服务器规格: 规格…

【 C++ 】 讲解与实现 对数器接口

什么是对数器 说是叫对数器,但我觉得叫做核验器更好。 为什么?因为其作用是核验算法是否正确,所以我觉得叫核验器更好。 注意:本文实现的是生成只能int类型的对数器,其余类型不支持。 对数器的原理 对于一个核验器&am…

怎么用手机远程控制电脑 远程控制怎么用

怎么用手机远程控制电脑:远程控制怎么用 在这个科技日新月异的时代,远程控制电脑已经成为了很多人的需求。有时,我们可能在外出时突然需要访问家中的电脑,或者在工作中需要远程操控办公室的电脑。这时,如果能用手机远…

layui框架实战案例(27):弹出二次验证

HTML容器 <button class"layui-btn layui-btn-sm layui-btn-danger" lay-event"delete"><i class"layui-icon layui-icon-delete"></i>批量删除</button>删除封装函数 function delAll(school_id, school_name) {var lo…

Springboot+Vue项目-基于Java+MySQL的网上超市系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【信号处理】基于EEG脑电信号的自闭症预测典型方法实现

理论 自闭者主要受到遗传和环境因素的共同影响。由于自闭症是一种谱系障碍&#xff0c;因此每个自闭症患者都有独特的优势和挑战。自闭症患者学习、思考和解决问题的方式可以是高技能的&#xff0c;也可以是严峻的挑战。研究表明&#xff0c;高质量的早期干预可以改善学习、沟…

ZStack教育云计算解决方案入选高质量数字化转型技术解决方案集

近日&#xff0c;中国信通院“铸基计划”《高质量数字化转型技术解决方案&#xff08;2023年度&#xff09;》&#xff08;以下简称“方案集”&#xff09;发布&#xff0c;云轴科技ZStack智慧教育云计算解决方案入选《高质量数字化转型技术解决方案集》。 为促进数字化转型相…

第63天:服务攻防-框架安全CVE 复现DjangoFlaskNode.JSJQuery

目录 思维导图 案例一&#xff1a;JavaScript-开发框架安全-Jquery&Node node.js目录穿越 CVE-2021-21315命令执行 Jquery CVE-2018-9207 案例二&#xff1a;Python-开发框架安全-Django&Flask django cve_2019_14234 CVE-2021-35042 flask ssti 思维导图 案…

Jenkins和gitlab实现CICD

1 背景 在开发TracerBackend服务的时候&#xff0c;每次更改代码之后需要推送到gitlab&#xff0c;然后ssh登录到Ubuntu的服务器上部署新的代码。服务成功启动之后&#xff0c;在本地执行测试用例&#xff0c;觉得这一套操作流程还是挺复杂的。想起公司的代码发布流程&#xf…

多模态视觉语言模型:BLIP和BLIP2

1. BLIP BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP的总体结构如下所示&#xff0c;主要包括三部分&#xff1a; 单模态编码器&#xff08;Image encoder/Text encoder&#xff09;&#xff1a;分别进…

智慧浪潮下的产业园区:解读智慧化转型如何打造高效、绿色、安全的新产业高地

随着信息技术的飞速发展&#xff0c;智慧化转型已经成为产业园区发展的重要趋势。在智慧浪潮的推动下&#xff0c;产业园区通过集成应用物联网、大数据、云计算、人工智能等先进技术手段&#xff0c;实现园区的智慧化、高效化、绿色化和安全化&#xff0c;从而打造成为新产业高…

(四)SQL面试题(连续登录、近N日留存)学习简要笔记 #CDA学习打卡

目录 一. 连续登录N天的用户数量 1&#xff09;举例题目 2&#xff09;分析思路 3&#xff09;解题步骤 &#xff08;a&#xff09;Step1&#xff1a;选择12月的记录&#xff0c;并根据用户ID和登录日期先去重 &#xff08;b&#xff09;Step2&#xff1a;创建辅助列a_rk…