文章目录
- 前言
- 一、什么是Spring
- 1, 什么是容器
- 2, 什么是IoC
- 二、如何理解IoC
- 1, 传统方式的代码编写
- 2, 控制反转的代码编写
- 3, 再谈IoC
- 三、什么是DI
- 总结
前言
各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)
本篇开始陆续介绍 Java 中的 Spring 框架相关内容, 首先要理解 Spring 的核心概念和设计思想
提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!
一、什么是Spring
Spring 指的是 Spring Framework(Spring 框架), Spring ⽀持⼴泛的应⽤场景, 它可以让 Java 企业级的应⽤程序开发起来更简单
Spring 的本质就是一个包含了众多工具方法的 IoC 容器
1, 什么是容器
字面意思, 就是可以容纳物品的装置, 可以是杯子, 花瓶, 碗…
之前学习过的数据结构, 顺序表, 链表, 栈, 哈希表… 这些也是容器, 只不过存储的是数据
2, 什么是IoC
IoC(Inversion of Control) 翻译成中⽂是 “控制反转” 的意思,也就是说 Spring 是⼀个“控制反转”的容器
- 什么是"控制反转"? 控制什么? 反转什么?
这里的控制说的是对代码的控制, 具体一点是对 Java 中对象的创建和销毁的控制
这里的反转说的是上述的"控制权"不再在我们手上, 而是交给了 Spring
下面用代码来理解"控制反转"的设计思想
二、如何理解IoC
设定一个场景 : 要造一辆车(Car 类), 需要依赖车身(Frame 类), 车身需要依赖底盘(Bottom 类), 底盘需要依赖轮胎(Tire 类)
按照之前的代码编写方式, 每一个上层都需要依赖下层, 下面用代码展示这些类的依赖关系和调用栈
1, 传统方式的代码编写
使用如下代码执行上述代码逻辑
public class Test {
public static void main(String[] args) {
Car car = new Car();
car.init();
}
}
上述形式的代码, 由于当前需求所产生的依赖关系, Car 类需要调用 Frame 类的方法, 就必须先自己创建一个 Frame 类, 导致各个类之间的 耦合度非常高!!
如果我们需要给 Trie 类的构造方法新增参数, 就需要逐步更改整个调用栈的代码, 在实际的项目中, 这种情况非常麻烦非常恐怖
要改善这种"牵一发而动全身"的情况, 就必须降低各个类之间的耦合度, 如果我们不再自己创建类, 而是通过注入(传递)的方式来得到所需的类, 就不需要关心所需的类发生任何改变而牵动当前的代码
Spring 中, 类对象称作 Bean 对象, 获取 Bean 对象叫做"对象装配", 也叫做"对象注入", 后续文章会详细介绍
2, 控制反转的代码编写
我们通过传递参数的方式来获取到所需的类对象(Bean 对象), 这种方式就是"注入"
上述代码中没有 new 对象的操作, 注入进来的 Bean 对象是被谁 new 的? 实际上是被 Spring 框架创建的
我们用 Test 类来代替模拟 Spring (IoC 容器)
public class Test {
private Car car;
private Frame frame;
private Bottom bottom;
private Tire tire;
public Test() {
this.tire = new Tire();
this.bottom = new Bottom(this.tire);
this.frame = new Frame(this.bottom);
this.car = new Car(this.frame);
}
public static void main(String[] args) {
Test test = new Test();
test.car.init();
}
}
这样一来, 即便底层的代码需要修改, 也不需要更改整个调用链的代码, 这就实现了解耦合
- 如何体现"控制反转"了?
不再是 Car 控制和创建 Frame , Frame 控制并创建了 Bottom…, 控制反转之后 : 通过注入的方式, 把下级对象注入到当前对象, 下级的控制权不再由上级类控制
了
3, 再谈IoC
理解了 IoC 这个设计思想之后, 还要明确, 容器的作用就是 “存储” 和 “取出”
所以 Spring 就是一个包含众多工具方法的 IoC 容器, 意思就是, 把对象的创建和销毁的控制权交给 Spring 来管理, Spring 也具备存储和获取对象的能力
为什么要使用容器?
之前用顺序表, 链表, 哈希表, 二叉树…来存储数据, 就是为了不再每次使用的时候都创建, 而是从特定的容器里随用随取
现在用 IoC容器来存储对象, 也是为了不再每次使用的时候都 new 新的对象, 而是 new 了一次之后, 需要用的时候直接取, 用完再放回去方便以后使用
三、什么是DI
DI (Dependency Injection) , 依赖注入, 就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。
所以,依赖注入(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦
IoC 是一种设计思想, 而 DI 是具体的实现 IoC 思想的方式
总结
以上就是本篇的全部内容, Spring 就是一个包含众多工具方法的 IoC 容器, 意思就是, 把对象的创建和销毁的控制权交给 Spring 来管理, Spring 也具备存储和获取对象的能力, DI 是具体的实现 IoC 思想的方式
如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~
上山总比下山辛苦
下篇文章见