Spring---IOC与DI
文章目录
- 什么是Spring?
- 什么是Ioc?
- 通过代码案例理解
- 总结代码案例
- 真正理解Ioc
- 什么是DI?
什么是Spring?
Spring指的是 Spring Framework (Spring框架),它是一个开源的框架,有着活跃而庞大的社区。Spring支持广泛的应用场景,可以让Java程序的开发更加简单。
简单用一句话来概括 Spring 就是:Spring 是一个包含了众多工具方法的 Ioc 容器。
什么是容器呢?
容器就是用来容纳某种物品的装置,对于 Spring 来说,它容纳的是对象,我们可以把对象存入 Spring中,也可以把对象从 Spring 中取下来。
包含的众多工具方法是指:Spring 为我们提供了一些现成的方法来解决一些常见的问题,我们只需要直接调用即可。
什么是Ioc?
Ioc:Inversion of Control,是“控制反转”的意思。
那什么又是“控制反转”呢?
控制反转其实指的是:将对象的生命周期交给 Spring 控制,不再由我们自己控制了。
通过代码案例理解
大家可以根据下面的示例进一步理解:
- 传统的开发方式:
//我们传统代码中的依赖关系:
public class NewCarExample {
public static void main(String[] args) {
Car car = new Car();
car.init();
}
/**
* 汽⻋对象
*/
static class Car {
public void init() {
// 依赖⻋身
Framework framework = new Framework();
framework.init();
}
}
/**
* ⻋身类
*/
static class Framework {
public void init() {
// 依赖底盘
Bottom bottom = new Bottom();
bottom.init();
}
}
/**
* 底盘类
*/
static class Bottom {
public void init() {
// 依赖轮胎
Tire tire = new Tire();
tire.init();
}
}
/**
* 轮胎类
*/
static class Tire {
// 尺⼨
private int size = 30;
public void init() {
System.out.println("轮胎尺⼨:" + size);
}
}
}
问题:当底层代码改动之后,整个调用链上的代码都要修改。
解决:不在每个类中创建下级类,这样就没有依赖关系了。交给 Spring 管理即可。
- Spring 开发
//Spring 开发解决依赖问题
public class IocCarExample {
public static void main(String[] args) {
Tire tire = new Tire(20);
Bottom bottom = new Bottom(tire);
Framework framework = new Framework(bottom);
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 Bottom bottom;
public Framework(Bottom bottom) {
this.bottom = bottom;
}
public void init() {
bottom.init();
}
}
static class Bottom {
private Tire tire;
public Bottom(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("轮胎:" + size);
}
}
}
代码经过以上调整,不管底层代码如何修改都不会影响到调用链上的代码。
总结代码案例
我们可以看到使用 Spring 后对象的控制权发生了反转。不再是上级对象创建并控制下级对象了,而是把下级对象注入到上级对象中。
真正理解Ioc
Spring 是一个Ioc(控制反转)容器。控制反转是特性,容器才是本质。既然是容器,它就具备两个基本功能:将对象存入容器、从容器中取出对象。那么 Spring 是一个Ioc容器 再换句话说就是,对象的创建和销毁的权力都交给 Spring 来管理了,它本身又具备了存储对象和获取对象的能力。
把对象放到容器中有什么好处呢?
将对象存储到 Ioc容器 中,相当于把以后可能会用到的所有工具都制作好放到仓库中,需要的使用直接取走使用,用完了再放回仓库中。
而 new 对象的方式,相当于每次需要使用工具了才现做,用完了也不保存,下次再用的时候还得再做。
总结:使用 Spring 来管理对象后,每个对象都是一个个体,他们之间没有依赖关系,各自实现各自的功能,不会相互影响。由 Spring来控制他们进行合作配合。
什么是DI?
DI:Dependency Injection,意思是“依赖注入”。就是在 Ioc容器 运行期间,动态的将某种依赖关系注入到对象中。
所以,Ioc 和 DI 是从不同的角度来描述同一件事情。就是指通过 Ioc 容器 ,利用 DI 的方式,来实现对象间的解耦合。
Ioc 是一种思想;DI 是具体的实现。