Spring核心与设计思想 -- IoC与DI
创始人
2024-05-08 10:18:29
0

Spring核心与设计思想 -- IoC与DI

  • 一、Spring 是什么?
    • 1.1 什么是容器?
    • 1.2 什么是 IoC?
  • 二、理解 IoC
    • 2.1 传统程序开发的问题
    • 2.2 分析
    • 2.3 控制反转式程序开发
    • 2.4 对比总结规律
    • 2.5 理解 Spring IoC
  • 三、DI 概念说明

一、Spring 是什么?

我们通常所说的 Spring 指的是 Spring Framework (Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应用程序开发起来更简单。

⽤⼀句话概括 Spring:Spring 是包含了众多工具方法的 IoC 容器。

那么问题来了,什么是容器?什么又是 IoC 容器呢?

1.1 什么是容器?

顾名思义,容器是用来容纳某种物品的。
我们接触过的容器都有哪些?

  • List/Map -> 数据存储容器
  • Tomcat -> Web 容器

1.2 什么是 IoC?

IoC = Inversion of Control 翻译成中⽂是 “控制(权)反转” 的意思,也就是说 Spring 是⼀个 “控制反转” 的容器。怎么理解这句话呢?我们先从以下示例开始 ~

二、理解 IoC

2.1 传统程序开发的问题

假如,我们现在构建⼀辆 “车” 的程序,我们的实现思路是这样的:
在这里插入图片描述

构建⼀辆车 (Car Class),然而车需要依赖车身 (FrameWork Class),而车身需要依赖底盘 (Bottom Class),而底盘需要依赖轮胎 (Tire Class),最终程序的实现代码如下:(轮胎只有一个 size 属性)

package old;/*** 构建“车”*/
public class Car {private Framework framework;public Car(int size) {framework = new Framework(size);}public static void main(String[] args) {int size = 15;// 构建并运行车Car car = new Car(size);car.init();}// 运行public void init() {System.out.println("Car init.");// 依赖 framework init() 方法framework.init();}
}
package old;/*** 车身*/
public class Framework {private Bottom bottom;public Framework(int size) {bottom = new Bottom(size);}public void init() {System.out.println("Framework init.");// 依赖 Bottom:init()bottom.init();}
}
package old;/*** 底盘*/
public class Bottom {private Tire tire;public Bottom(int size) {tire = new Tire(size); // 自己(创)造}public void init() {System.out.println("Bottom init.");// 依赖:Tire:init()tire.init();}
}
package old;/*** 轮胎*/
public class Tire {// 尺寸private int size = 17;// 材质...// 花纹...// 颜色...// ...public Tire(int size) {this.size = size;}public void init() {System.out.println("Tire size:" + size);}
}

以上程序中,轮胎属性信息只有 size,然而随着对车的需求量越来越大,个性化需求也会越来越多,这时候我们就需要加工具有多个属性的轮胎。

而以上程序的问题是:添加轮胎属性时,即最底层代码改动之后,整个调用链上的所有代码 (所有类) 都需要修改。

2.2 分析

如何解决上述问题呢?
我们可以尝试不在每个类中自己创建下级类,如果自己创建下级类就会出现当下级类发生改变操作,自己也要跟着修改。

我们只需要将原来由自己创建的下级类,改为传递的方式 (也就是注入的方式),因为我们不需要在当前类中创建下级类了,所以下级类即使发生变化 (创建或减少参数),当前类本身也无需修改任何代码,这样就完成了程序的解耦

解耦指的是解决了代码的耦合性问题,耦合性换⼀种叫法为程序相关性。好的程序代码的耦合性 (代码之间的相关性) 是很低的 ~~

这就好比我们打造⼀辆完整的汽车,如果所有的配件都是自己造,那么当客户需求发⽣改变的时候,我们就要自己动手来改了;但如果我们是把轮胎外包出去,那么我们只需要向代理工厂下订单就行了,我们自身是不需要出力的。

2.3 控制反转式程序开发

基于以上思路,我们把调用汽车的程序示例改造⼀下,把创建子类的方式,改为注入传递的方式,具体实现代码如下:

package v2;public class TireV2 {private int size = 17;private String color = "黑色";public TireV2(int size, String color) {this.size = size;this.color = color;}public void init() {System.out.println("Tire v2 size:" + size);}
}
package v2;public class BottomV2 {private TireV2 tireV2;public BottomV2(TireV2 tireV2) {this.tireV2 = tireV2;}public void init() {System.out.println("Bottom v2 init.");tireV2.init();}
}
package v2;public class FrameworkV2 {private BottomV2 bottomV2;public FrameworkV2(BottomV2 bottomV2) {this.bottomV2 = bottomV2;}public void init() {System.out.println("Framework v2 init.");bottomV2.init();}
}
package v2;/*** 控制反转的车*/
public class CarV2 {private FrameworkV2 frameworkV2; // 依赖public CarV2(FrameworkV2 frameworkV2) {
//        frameworkV2 = new FrameworkV2(); // 自己创建(自己控制对象的生命周期)this.frameworkV2 = frameworkV2; // Car 构造方法不会在创建}public void init() {System.out.println("Car v2 init.");// 依赖 framework:init()frameworkV2.init();}
}

启动类:

package v2;public class App {public static void main(String[] args) {// 程序调用int size = 15;String color = "红色";TireV2 tireV2 = new TireV2(size, color);BottomV2 bottomV2 = new BottomV2(tireV2);FrameworkV2 frameworkV2 = new FrameworkV2(bottomV2);CarV2 carV2 = new CarV2(frameworkV2);carV2.init();}
}

代码经过以上调整,无论底层类如何变化,整个调用链是不用做任何改变的。这样就完成了代码之间的解耦,从而实现了更加灵活、通用的程序设计!
在这里插入图片描述

2.4 对比总结规律

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

在这里插入图片描述

传统代码是 Car 创建并控制了 Framework,Framework 创建并控制了 Bottom,依次往下…而改进之后的控制权发生了反转,不再是上级对象创建并控制下级对象了,而是下级对象注入当前对象中,下级不再由上级类控制了!这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。
谁调用我,就把控制权交给谁!而不是自己来控制,不用自己去new对象

2.5 理解 Spring IoC

回到我们的主题 Spring,本⽂刚开始咱们就讲:Spring 是包含了多个工具方法的 IoC 容器,这就是对 Spring 最核心的总结。“集成多个工具方法”这事咱们以后慢慢再谈,那如何理解“Spring 是⼀个 IoC 容器”这句话呢?

既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功能:

  • 将对象存入到容器
  • 从容器中取出对象

也就是说 学习 Spring 最核心的功能,就是学习将对象存入到 Spring 中,再从 Spring 中获取对象的过程 ~

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

Spring 是⼀个 IoC 容器,即 对象创建和销毁的权利都交给 Spring 来管理了,它本身又具备了存储对象和获取对象的能力。

三、DI 概念说明

谈到 IoC,不得不提的⼀个词就是 “DI”,DI 是 Dependency Injection 的缩写,翻译成中⽂是 “依赖注入” 的意思。

所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同⼀件事情,就是指通过引入 IoC 容器,利用依赖关系注⼊的方式,实现对象之间的解耦。

IoC 是“目标”也是⼀种思想,而目标和思想只是⼀种指导原则,最终还是要有可行的落地⽅案,而 DI
就属于具体的实现。

比如说我今天心情比较好,要吃一顿好的犒劳犒劳自己,那么“吃⼀顿好的”是思想和目标 (是 IoC),但最后我是吃海底捞还是必胜客…?这就是具体的实现,就是 DI 。

相关内容

热门资讯

安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...
安卓系统能玩部落冲突吗,部落冲... 你有没有想过,安卓系统上的手机,是不是也能玩那款风靡全球的《部落冲突》呢?这款游戏自从推出以来,就吸...
智能机器人安卓系统,引领未来智... 你知道吗?在科技飞速发展的今天,智能机器人已经不再是科幻电影里的专属了。它们正悄悄地走进我们的生活,...
华为win10系统改装安卓系统... 你有没有想过,你的华为笔记本电脑里的Windows 10系统,能不能来个华丽变身,变成安卓系统呢?这...
旧电脑上安什么安卓系统,适配不... 你那台旧电脑是不是已经闲置好久了?别让它默默无闻地躺在角落里,给它来个华丽变身吧!今天,就让我来告诉...
安卓app语言跟随系统,随系统... 你知道吗?在手机世界里,有一个神奇的小功能,它就像你的贴身翻译官,无论你走到哪里,都能帮你轻松应对各...
惠城安卓系统降级在哪,揭秘降级... 你有没有遇到过手机系统升级后,发现新系统让你头疼不已,想回到那个熟悉的安卓系统呢?别急,今天就来告诉...
阿里云系统转安卓,揭秘安卓平台... 你知道吗?最近有个大动作在互联网圈里引起了不小的波澜,那就是阿里云系统竟然要转战安卓阵营了!这可不是...
安卓系统有最美壁纸么,探寻最美... 哦,亲爱的安卓用户,你是否曾在某个午后,百无聊赖地翻看着手机,突然被那一张张壁纸惊艳了眼眸?是的,我...
安卓系统采用Linux操作系统... 你知道吗?安卓系统,这个在我们手机上无处不在的小家伙,它的心脏竟然是Linux操作系统内核!是不是觉...
安卓原生平板通用系统,探索安卓... 你有没有发现,现在市面上平板电脑的品牌和型号真是五花八门,让人挑花了眼?不过,你知道吗?在众多安卓平...
小米1系统是安卓几,搭载安卓几... 你有没有想过,你的小米手机里那个熟悉的系统,其实是基于安卓的哦!没错,就是那个全球最流行的手机操作系...
可以安装安卓系统的相机,智能摄... 你有没有想过,一台相机不仅能拍出美美的照片,还能像智能手机一样,玩转各种应用?没错,现在市面上就有这...
安卓系统gps定位不准,安卓G... 你是不是也遇到过这种情况?手机里的安卓系统GPS定位总是不准,让人头疼不已。有时候,你明明就在家附近...
电信机顶盒装安卓系统,开启智能... 你有没有想过,家里的电信机顶盒其实也可以装上安卓系统呢?听起来是不是有点不可思议?别急,让我带你一步...
安卓系统可以做苹果桌面,打造个... 你知道吗?现在科技的发展真是让人眼花缭乱,竟然有人想出了安卓系统可以做苹果桌面的神奇想法!是不是觉得...
安卓系统自带的网页,功能与特色... 你有没有发现,每次打开安卓手机,那熟悉的系统界面里总有一个默默无闻的小家伙——安卓系统自带的网页浏览...