面试题:Spring IOC 为什么能降低耦合?

文章目录

  • 前言
  • 一、传统方式创建对象
  • 二、接口编程
  • 三、工厂方法
  • 四、反射
  • 五、Spring IOC
  • 总结


前言

有同学在学习 Spring 框架中可能会问这样的问题,为什么通过依赖注入就可以降低代码间的耦合呢?我通过 new 生产对象不也可以吗,不就是一行代码的不同,一个是 @Resource 注入,一个是 new 创建,怎么就降低耦合了?


一、传统方式创建对象

通常我们是这样创建对象的

WuliCar wuli = new WuliCar();
wuli.run();

第一天:二明想用一辆车,然后通过 new 搞了一辆五菱荣光,调用 run 方法开始使用,车子跑起来了,很高兴。

一个月后:二明公司赚钱了,不想开五菱了,想换辆宝马,接下来二明一顿操作:

BaomaCar baoma = new BaomaCar();
baoma.run();

很好,车子从五菱换成了宝马,跑起来了,很高兴。

半年后:二明公司赚大钱了,二明想搞辆直升机,接下来又一顿操作

ZhiShenJi zhi = new ZhiShenJi();
zhi.fly();

这次改动比较大,宝马换成直升机,run 换成了 fly。

看到这里先思考一下,不想往下看,这样做有什么问题吗?

思考时间到,我们接着往下看。

从代码看好像没多大问题,不就改了两行代码嘛,这有啥。你想想,如果你的代码中有 1000 个地方都是这么写的,你想把宝马换成直升机岂不是要改 1000 次,run 改成 fly 又要改 1000 次,晚上别想下班了。

二、接口编程

经过上次一顿操作,二明加了好几天班才弄完,二明想想每天这么搞不得累死,不行,得想想办法。于是二明脑子一转了,一想就想到了。我定义好一些方法,大家都按照这个规则来,不就好了。

public interface vehicle {// 定义一个交通工具接口,有一个 work 方法void work();
}

宝马实现这个接口:

public class Baoma implements vehicle {@Overridepublic void work() {System.out.println("宝马跑起来");        }
}

飞机实现这个接口:

public class ZhiShenJi implements vehicle {@Overridepublic void work() {System.out.println("直升机飞起来");        }
}

经过上面改造后,后面二明想把宝马换成直升机的时候只需要修改 new 那块就可以了,省了很多时间

三、工厂方法

利用接口确实好一些了,但是问题还是没有解决。为了提高内聚性,专职类负责特定的事情,所以我们使用一个类作为工厂类,既能生产 Car 又能生产 ZhiShenJi

class VehicleFactory{VehicleFactory(){}public static Vehicle getInstance(String type){Animal result = null;if("car".equals(type)){result = new Car();}if("zhishenji".equals(type)){result = new ZhiShenJi();}return result;}
}

如果有一次我想锻炼身体,想骑自行车了,那么很简单

class VehicleFactory{VehicleFactory(){}public static Vehicle getInstance(String type){Animal result = null;if("car".equals(type)){result = new Car();}if("zhishenji".equals(type)){result = new ZhiShenJi();}if("zixingche".equals(type)){result = new ZiXingChe();}return result;}
}
Vehicle vehicle = VehicleFactory.getInstance("zixingche");
vehicle.work();

这种方法把创建对象的过程交给了一个专业的类(Factory),我只需要告诉他我需要什么(参数),他就会返回给我正确的对象,只是解决了内聚性的问题,但是他并没有解决我的声明语句七零八落的散落在程序中,我还是需要去将参数从car替换为zixingche

四、反射

后来二明想到一个更绝妙的主意.我在写程序的时候不告诉工厂我需要什么,等到运行的时候我再告诉工厂我需要什么,再利用反射技术给我生产出来不就可以了吗?二明说干就干

Vehicle vehicle = VehicleFactory.getInstance(读取配置文件);
vehicle.work();我想要的:zixingche
zixingche.work();    

大功告成,这样我要什么,都写在一个配置文件中,利用反射技术就可以创建好,这样我就不用在生产了,下次换车的时候直接去配置文件中修改就好了,代码中不用修改。

对于生产对象这件和业务没有直接关系的事情,我们已经提取给了专业的工厂,专业的工厂还是根据配置文件进行的生产,想生产什么我只需要改一处即可,这就是降低了耦合性(生产对象和业务之间的耦合,让生产对象对业务的影响降到了最低)。

五、Spring IOC

上面第四点说的那些功能,Spring IOC 已经帮助我们实现了,Spring IOC 就是利用工厂模式+反射实现自动生产对象,管理对象生命周期的功能。降低了代码的耦合


总结

  • 依赖注入的意思是你需要的东西不是由你创建的,而是第三方,或者说容器提供给你的。这样的设计符合正交性,即所谓的松耦合。
  • 依赖注入是调用者仅通过声明某个组件就可以获得组件的控制权,而对该组件的依赖关系管理、查找、加载由外部完成。
  • 依赖注入就是你不用关心对象的生命周期,什么时候被创建,什么时候销毁,只需直接使用即可,对象的生命周期由提供依赖注入的框架来管理。

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

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

相关文章

爬虫解析-jsonpath (六)

jsonpath只能解析本地文件 jsonpath的使用: obj json.load(open(.json文件,r,encodingutf-8))place_name jsonpath.jsonpath(obj, json语法) 目录 1.安装jsonpath 2.Xpath和jsonpath的语法对比 练习:使用jsonpath解析JSON文件 3.使用jsonpath抓取…

7.2 C++11默认函数的控制

一、默认函数 C默认会实现一些函数,其中类成员函数有: 构造函数析构函数拷贝构造赋值函数()移动构造移动赋值 以及一些全局操作函数: operator,operator&operator&&operator*operator->operator->*operator newoperato…

C#语言独立开发完成一个简易的程序(软件)Windows窗体应用程序

1.课程考核具体内容: 每位学生在集成环境Visual Studio 2012下用C#语言独立开发完成一个简易的程序(软件) ,要求选择Windows窗体应用程序的方式进行设计与开发,程序(软件)的界面整洁、美观,相关功能的实现没有问题,程序(软件)能正…

Vue + Element 实现按钮指定间隔时间点击

1、业务需求 需要加一个按钮&#xff0c;调用第三方API&#xff0c;按钮十分钟之内只能点击一次&#xff0c;刷新页面也只能点击一次 2、思路 加一个本地缓存的时间戳&#xff0c;通过时间戳计算指定时间内不能点击按钮 3、实现 1&#xff09;vue页面 <template>&l…

海奇(Hichip)编译环境搭建:适用于hclinux及hcrtos

文章目录 一、篇头二、工具安装1. 基础工具2.交叉工具链3. 可选:python 多版本配置三、编译测试1. 编译:hclinux D31002. 编译:hcrtos D3100四、附录1. cmake 版本过低2. version `GLIBC_2.34 not found3. multiple definition of \`yylloc;4. GCC版本查看</

力扣面试150题 | 27.移除元素

力扣面试150题 &#xff5c; 27.移除元素 题目描述解题思路代码实现复杂度分析 题目描述 27.移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必…

/proc/sys/net/ipv4/ 下网络参数的理解

/proc/sys/net/ipv4/下文件详细解释&#xff1a; /proc/sys/net/ipv4/下文件 /proc/sys/net/ipv4/ip_forward 该文件表示是否打开IP转发。 0&#xff0c;禁止 1&#xff0c;转发 基本用途&#xff1a;如VPN、路由产品的利用&#xff1b; 出于安全考虑&#xff0c;Linux系…

4.Java程序设计-基于springboot得在线考试系统

编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;772162324 摘要&#xff1a; 本文设计并实现了一款基于Spring Boot框架的在线考试系统小程序。随着远程学习和在线教育的普及&#xff0c;对于灵活、便捷的在线考试系统的需求逐渐增加。该小程序…

QT 重定向qdebug输出到自绘界面

因为在嵌入式中调试qt需要查看输出信息,特意写了一个类用户便捷查看qdebug信息 界面如下: 提供了开始,停止,保存,清空,退出功能,具体代码下文给出 文件如下 #ifndef QDEBUGREDIRECT_H #define QDEBUGREDIRECT_H /**qdebug 重定向类 定向到界面控件*李吉磊 2023.12.7* */#in…

指针(四)

因为前期在学驱动&#xff0c;所以花了一天时间借鉴了别的资料&#xff0c;把本科学的C语言捡起来。 指针的基本概念 堆栈有栈顶指针&#xff0c;队列有头指针和尾指针&#xff0c;这些概念中的"指针"本质上是一个整数&#xff0c;是数组的索引&#xff0c;通过指针…

CnetSDK .NET OCR Library SDK Crack

CnetSDK .NET OCR Library SDK Crack CnetSDK .NET OCR Library SDK 是一款高精度 .NET OCR 扫描仪软件&#xff0c;用于从图像中识别字符&#xff0c;如文本、手写和符号。该.NET OCR库软件采用Tesseract OCR引擎技术&#xff0c;将字符识别准确率提高高达99%。通过将 .NET OC…

C++【智能指针】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;为什么需要智能指针&#x…

实验3.5 路由器的单臂路由配置

实验3.5 路由器的单臂路由配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.SWA的基本配置2.RA的基本配置3.在RA上查看接口状态 六、任务验收七、任务小结 一、任务描述 某公司对部门划分了需VLAN之后&#xff0c;发现两个部门之间无法通信&#xff0c;但…

机器学习——logistic回归

目录 一、线性模型与回归 二、基于logistic回归和Sigmoid函数的分类 三、最优化算法 1. 最大似然估计 2. 梯度上升法 3. 训练算法&#xff1a;梯度上升 4. 绘制决策边界 5. 训练算法&#xff1a;随机梯度上升 6. 改进的随机梯度算法 四、从疝气病症预测病马的死亡率 …

生成对抗网络GAN中的潜向量Z是用来做什么的?

在生成对抗网络&#xff08;GAN&#xff09;中&#xff0c;潜在向量 Z 是一个随机噪声向量&#xff0c;通常是从某种分布中采样得到的。这个潜在向量 Z 的作用是引入随机性&#xff0c;使得生成器能够生成多样化、非确定性的输出。 具体来说&#xff0c;潜在向量 Z 的作用包括…

408数据结构备考代码整理和算法思想归纳

一 线性表 (1)顺序表 1 顺序表的定义 typedef struct{int length;//记录当前长度int array[MAX];//表示最大长度为MAX }2插入操作:先判断插入的位序合不合法以及存储空间有没有满。而后插入的位序的后面的所有数相后 移动一位,而后插入,length++; 3删除操作:把删除的…

在jupyter notebook中修改其他文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C/PTA】结构体进阶练习

本文结合PTA专项练习带领读者掌握结构体&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 7-1 一帮一7-2 考试座位号7-3 新键表输出7-4 可怕的素质7-5 找出同龄者7-6 排队7-7 军训7-8 双链表 7-1 一帮一 “一帮一学习小组”是中…

力扣题:数字与字符串间转换-12.8

力扣题-12.8 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;299. 猜数字游戏 解题思想&#xff1a;进行遍历&#xff0c;统计完全相同的数字和不相同的数字即可&#xff0c;然后统计不相同的数字在秘密数字和猜测数字中共同出现的次数 class Sol…

Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版(视频笔记)

视频源&#xff1a;1.03-k8s是什么&#xff1f;_哔哩哔哩_bilibili 1 基础知识 1.1 K8s 有用么&#xff1f; K8s有没有用 K8s要不要学&#xff1f; 参考资料: https://www.infoq.com/articles/devops-and-cloud-trends-2022/?itm_sourcearticles_about_InfoQ-trends-report…