目录
一、Spring是什么?
Spring就是包含了很多工具方法的 IoC 容器。
1. 什么是IoC,什么是容器
2. IoC的优点 (解决耦合问题)
二、什么是Spring IoC
1. Spring IoC详解
(1)也就是学习 Spring 最核心的功能:
(2)将对象存放到容器中的好处:
(3)为什么Spring是一个IoC容器:
2. 什么是DI(Dependency Injection)
前言
从这篇文章开始进入EE进阶的学习,内容就是学习一些企业主流的框架,首先学习框架的意义就在于可以高效的开发项目,高效就是框架最大的优势,框架也是更易用的。首先来说EE初阶学习的 servlet 其实和主流的 Spring-Boot 框架相比是有很多的不方便的地方:
1. 添加外部jar包不方便,必须要外部的jar包版本是匹配的 |
2. 运行和调试需要配置tomcat |
3. 发布 servlet 项目需要依靠tomcat(外置web容器)运行 |
4. 路由配置不方便,一个访问地址对应一个 Servlet 类等等 |
但是如果是一个Spring-Boot项目,此时就没有servlet的痛点。所以,学习如何高效的做出项目是很有必要的。
一、Spring是什么?
Spring值得是 Spring Framework(Spring框架),它是开源的框架,支持广泛的应用场景,可以让Java企业的应用程序开发更简单高效。
Spring就是包含了很多工具方法的 IoC 容器。
1. 什么是IoC,什么是容器
容器 | 就是用来容纳物品的一个装置。在之前的文章中也有提到,向Java集合框架中的List,Map,这就是存储数据的一个容器,还有Tomcat就Web容器。 |
IoC | (Inversion of Control)我们需要把它翻译成 ”控制权的反转“ 的一个容器,我们可以用一个场景来解释什么是控制权的反转:有一个A对象和B对象,此时如果要使用B对象,要依赖B对象才可以使用,所以此时就需要在A对象中 new 一个B对象,也就是说 A对象控制着B对象的生命周期,用到了就去创建它,不用了就把它销毁 |
但是此时如果在代码层次就有很大的问题:耦合,所谓的耦合就是A对象依赖B对象才能使用,如果B对象的构造方法改了,或者是加了参数,或者是减少了参数,此时A对象也要跟着B对象一起改变,此时的代码就称为 "高耦合"。 但是开发要求的代码是 "高内聚,低耦合"的,不能是一个代码模块改变之后,其他调用链上的代码都要跟着一起改变。
控制权的反转的意思就是A对象不控制B对象的生命周期了,在使用A对象的时候只是给A对象传一个类似参数的东西(B对象),至于B对象的控制权交给哪个对象来控制,此时A是不关心的,所以此时就发生了一个控制(权)的反转,如下图:
2. IoC的优点 (解决耦合问题)
如果现在需要在程序中造一辆车,首先就有一个车身,地盘,轮胎,所以造车的时候,车是依赖于车身的,车身又依赖于地盘,此时依赖关系,如下代码:
package IoC;
public class Car {
private Framework framework;
public void init() {
System.out.println(" do car");
framework = new Framework();
framework.init();
}
public static void main(String[] args) {
Car car = new Car();
car.init();
}
}
package IoC;
public class Framework {
public void init() {
System.out.println("do framework");
Bottom bottom = new Bottom();
bottom.init();
}
}
package IoC;
public class Bottom {
public void init() {
System.out.println("do bottom");
Tire tire = new Tire();
tire.init();
}
}
package IoC;
public class Tire {
private int size = 17;
public void init() {
System.out.println("size ->" + size);
}
}
此时的轮胎的size是固定大小的,但是我如果需要一个别的尺寸的轮胎就需要在init方法中传一个size的参数,如下代码:
但是在init方法中传入一个参数之后,此时有依赖关系的调用链中的所有的代码都有问题了,都需要改这个参数, Tire类的init方法中有了参数,Bottom类中就需要传一个参数,Bottom类中传了参数之后,Framework类中又有问题了......
但是如果是控制权反转了,不再在car类中控制framework的生命周期,只是在需要使用的时候传这样的一个参数,此时就不会再出现耦合的现象了,如下代码:
所以从上述代码来看:
传统的 new 对象的方式创建顺序: Car --> Framework --> Bottom --> Tire |
IoC类的创建顺序:Tire --> Bottom --> Framework --> Car |
此时就发生了控制权的反转,代码经过上述调整,无论底层咋变化,整个程序调用链是不会做出改变的,这样就完成了代码之间的解耦,从而更加灵活,通用的设计程序了。这也就是IoC实现的思想。
二、什么是Spring IoC
1. Spring IoC详解
既然Spring是一个IoC(控制反转)容器,重点还在 容器 身上,只要它是一个容器,此时就又两个最基本的功能:
1. 将对象存入到容器中 |
2. 从容器中取出对象使用 |
(1)也就是学习 Spring 最核心的功能:
学习如何 将对象存到Spring中,再从Spring中获取对象的过程。
(2)将对象存放到容器中的好处:
将对象存储在IoC容器中相当于将以后可能用到的所有工具制作好放到仓库中,需要的时候直接取即可,用完再将对象放回i仓库中,而 new 对象的方式就相当于每次需要工具的时候才开始做,用完了就扔掉,也不会进行保存,下次再使用的时候还得重新做。
这就是IoC容器和普通开发程序的区别。
(3)为什么Spring是一个IoC容器:
指的是对象的创建和销毁的权利都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。
2. 什么是DI(Dependency Injection)
DI 翻译成中文就是 "依赖注入" 的意思,所谓依赖注入就是 IoC 的一种具体的实现方式,就是由IoC容器在运行期间,动态将某种依赖关系注入到对象中,也就是指通过引入IoC容器,利用依赖关系注入的方式,来实现对象和对象之间的解耦。(IoC是一种思想,而DI就属于具体的实现方式)
而具体是如何在代码层次实现的 DI 会在下一篇文章 Spring 的创建和使用中详解。