Spring的IOCDI
创始人
2025-05-28 01:52:43
0

文章目录

  • Spring
    • Spring是什么?
      • 什么是IoC
      • 传统程序开发
      • 控制反转式程序开发
      • 小结
    • DI(依赖注入)
      • IoC和DI的区别
      • 总结


Spring

Spring是什么?

我们通常所说的Spring指的是 Spring Framework(Spring框架),它是一个开源框架。

用一句话概括:Sping是包含了众多工具方法IoC容器

什么是IoC

Sping是一个IoC容器

什么是IoC?IoC = Inversion of Control,翻译成中文就是控制反转的意思。

也就是说Spring是一个控制反转的容器

传统程序开发

举个列子

列如,我们我们现在构建一辆车。

构造的顺序是:汽车->车身->底盘->轮胎

public class CarDemo {public static void main(String[] args) {Car car = new Car();car.run();}/*** 汽车类*/static class Car {public void run() {Framework frame = new Framework();frame.init();}}/*** 车身*/static class Framework {public void init() {Chassis chassis = new Chassis();chassis.init();}}/*** 底盘*/static class Chassis {public void init() {Tire tire = new Tire();tire.init();}}/*** 轮胎类*/static class Tire {private int size = 20;public void init() {System.out.println("车轮大小为"+size);}}
}

传统程序开发的缺陷

以上程序开发车轮的大小时固定的,车身颜色也不能设置。随着客户的需求越来越多。所以就要设置多种车轮和车身颜色

  • 当我们我们修改了轮胎类底盘类就受到了影响
  • 我们就得修改底盘类,修改底盘类后又发现车身类受到了影响
  • 我们又得继续修改车身类,修改完车身类后又有了新的问题
  • 汽车类受到影响,又得做修改
public class NewCarDemo {public static void main(String[] args) {Car car = new Car();car.run(20);}/*** 汽车类*/static class Car {public void run(int size) {//依赖车身Framework frame = new Framework();frame.init(size);}}/*** 车身*/static class Framework {public void init(int size) {//依赖底盘Chassis chassis = new Chassis();chassis.init(size);}}/*** 底盘*/static class Chassis {public void init(int size) {//依赖轮胎Tire tire = new Tire();tire.init(size);}}/*** 轮胎类*/static class Tire {public void init(int size) {System.out.println("车轮大小为"+size);}}
}

从上面代码可以看出,当最底层代码改动后,整个调用链的代码都需要改动

当车轮发生发生改变时,就需要改底盘类

而底盘代码发生改变时,又需要改车身类

那如果车身又加了个颜色属性呢?,车身类一改汽车类又要改

传统开发的这种现象叫做代码的耦合问题

那么就可以使用IoC实现解耦合

控制反转式程序开发

public class IoCNewCarDemo {public static void main(String[] args) {//构造轮胎Tire tire = new Tire(30);//给底盘提供轮胎Chassis chassis = new Chassis(tire);//给车身提供底盘Framework framework = new Framework(chassis);//最后组成汽车Car car = new Car(framework);car.run();}/*** 车类*/static class Car {private Framework framework;public Car(Framework framework) {this.framework = framework;}public void run() {framework.init();}}/*** 车身类*/static class Framework {private Chassis chassis;public Framework(Chassis chassis) {this.chassis = chassis;}public void init() {chassis.init();}}/*** 底盘类*/static class Chassis {private Tire tire;public Chassis(Tire tire) {this.tire = tire;}public void init() {tire.init();}}/*** 轮胎类*/static class Tire {private int size;public Tire(int size) {this.size = size;}public void init() {System.out.println("车轮大小为 "+this.size);}}
}

IoC创建类的顺序:从小到大

轮胎->底盘->车身->Car

  • 创建类的顺序发送的改变(反转)
  • 底层调用类发生改变之后,IoC模式整个调用链上的代码是无需修改的实现了类与引用类的解耦,但传统开发方式是不行的
  • 之前如果需要使用依赖,需要自己创建并管理类的生命周期,IoC无需自己管理对象的生命周期

小结

在这里插入图片描述

传统开发创建汽车的顺序是

Car -> 车身->底盘->车轮->执行run:从大到小

IoC开发创建类的顺序是:从小到大

轮胎->底盘->车身->Car

通⽤程序的实现代码,类的创建顺序是反的

而改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想

DI(依赖注入)

在IoC容器启动的时候,动态将对象注册到容器中的一种手段

在创建当前类的时候,动态的将当前类的依赖对象注入(注册)进来的过程就叫做DI(依赖注入)

比如这里创建Car,而Car依赖于车身类。所有在创建 汽车类的时候需要把它的依赖类 Framework 动态的注入进来

/*** 车类*/static class Car {private Framework framework;public Car(Framework framework) {this.framework = framework;}public void run() {framework.init();}}

IoC和DI的区别

IOC是控制反转,它是一种设计思想;DI他是实现手段

比如现在心情比较好,我是说晚上要去吃个夜宵,这就是思想

晚上具体吃啥?吃火锅也就是实现手段

IoC通过控制反转可以实现依赖类之间的解耦,让我们不在关心依赖类的具体实现和生命周期,我们只要使用依赖类的时候,把依赖类注入进来就好了,在底层依赖类发生改变的时候无需关心它的实现。

IoC就是把之前我们需要自己创建的对象交给其它人,无需关心对象的创建细节,需要的时候直接拿过来用就好了

DI是IoC的一种具体实现手段,指的是程序在运行的时候动态的将对象注入到当前类的一种实现机制

如果当前类需要引入依赖类了,就可以把依赖类动态的注入到当前类中,让当前类可以引用到依赖类

IoC是指导思想,DI是实现手段

总结

Spring 是什么?如何理解 Spring?

Sping是包含了众多工具方法IoC容器,对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能力

学 Spring 最核⼼的功能,就是学如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓
库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具
了,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开
发的区别。

IoC和DI的区别

IoC是指导思想,DI是实现手段

Spring 最核⼼的功能是啥 ?

管理对象

把对象动态的注册到Spring当中,再从Spring当中把对象取出来


相关内容

热门资讯

老字号粽子热销,热食鲜粽吸引顾... 新京报讯(记者陈琳)端午节临近,各类粽子热销。记者从北京鸿宾楼、烤肉宛、烤肉季、曲园酒楼等多家老字号...
珠宝首饰板块持续走高 老凤祥、... 上证报中国证券网讯 5月28日午后,珠宝首饰板块持续走高,截至13时50分,老凤祥、菜百股份涨停,周...
沙宝亮回应暗香残留梗:万万没想... 【#沙宝亮回应暗香残留梗#:万万没想到会出圈】5月27日,@我是沙宝亮 #沙宝亮谢谢肖战黄觉的对手戏...
蓝盈莹《乘风破浪的姐姐》成团夜... 蓝盈莹《乘风破浪的姐姐》成团夜竟是倒数第一?蓝盈莹不是成团夜当晚碧磨倒数第型慧渣一,是往期观众喜爱度...
就业驿站、屋场会……基层就业服... 转自:央视网央视网消息:稳就业是当前经济工作的重点。面对高校毕业生等重点群体,各地正积极搭建均等普惠...
YU7能否延续“爆款基因”?小... 5月27日,小米集团(01810.HK)发布2025年第一季度财报。得益于汽车销量的大幅提升,期内,...
41岁TVB演员,突然宣布结婚... 现年41岁的TVB演员、金牌配角王致狄Andy,突然宣布结婚喜讯。他在社交媒体上,分享了向圈外女友求...
丰立智能跌2.05%,成交额1... 5月28日,丰立智能盘中下跌2.05%,截至14:02,报61.10元/股,成交1.80亿元,换手率...
松炀资源跌2.01%,成交额4... 5月28日,松炀资源盘中下跌2.01%,截至14:02,报13.13元/股,成交4038.74万元,...
诚迈科技跌2.01%,成交额9... 5月28日,诚迈科技盘中下跌2.01%,截至14:01,报41.40元/股,成交9188.48万元,...
航宇微跌2.06%,成交额1.... 5月28日,航宇微盘中下跌2.06%,截至14:02,报11.88元/股,成交1.02亿元,换手率1...
400CC血中是什么意思啊? 400CC血中是什么意思啊?那是个什么单位?cc就是毫升了,就是400毫升的血。=毫升血站对献血者每...
华源控股跌2.00%,成交额2... 5月28日,华源控股盘中下跌2.00%,截至13:56,报8.33元/股,成交2503.11万元,换...
雷电微力跌2.01%,成交额1... 5月28日,雷电微力盘中下跌2.01%,截至14:02,报48.75元/股,成交1.63亿元,换手率...
《麦琪的礼物》一共多少字? 《麦琪的礼物》一共多少字?我估算了一下,我手头找到的刘若端译的,大约有3266个字。
四川卫健委调查药企涉嫌贿赂百名... 【#四川卫健委调查药企涉嫌贿赂百名医生#】#药企回应涉嫌贿赂百名医生# 近日,一份四川省卫健委下发...
航天动力跌2.04%,成交额1... 5月28日,航天动力(维权)盘中下跌2.04%,截至14:02,报11.52元/股,成交1.62亿元...
痛别!她走了,享年68岁……曾... 转自:中国妇女网中国妇女报全媒体记者 王春霞 高越 田园黄蝶中国妇女报记者获悉,著名法学家、中国政法...
光大信托原董事长闫桂军,被控受... 5月27日,湖北省荆州市中级人民法院一审公开开庭审理了光大信托原党委书记、董事长闫桂军受贿、违法发放...
大行评级丨里昂:重申快手“跑赢... 里昂发表报告指,快手第一季业绩符合预期,总营收和经调整净利分别为326亿和46亿元,较去年同期增长1...