目录
一、什么是Spring
Spring指的是Spring Framework(Spring框架),它是一个包含了众多工具方法的IoC容器。
二、什么是IoC容器
1、什么是容器
通常我们所说的容器就是用来存取某种物品的装置,而程序中的容器,比如List/Map是存储数据的容器;Tomcat是存储Web程序的容器……
2、什么是IoC
IoC全称是Inversion of Control,即控制反转的意思,也就是说,Spring是一个控制反转的容器。
3、理解IoC
示例:构建一辆“车”的程序
3.1 传统的构建方式:
public class Old {
//汽车类
static class Car{
public FrameWork frameWork;//依赖车身
public Car(int size){
frameWork = new FrameWork(size);
}
//初始化汽车
public void init(){
frameWork.init();
}
}
//车身类
static class FrameWork{
public Bottom bottom;//依赖底盘
public FrameWork(int size){
bottom = new Bottom(size);
}
//初始化车身
public void init(){
bottom.init();
}
}
//底盘类
static class Bottom{
public Tire tire;//依赖轮胎
public Bottom(int size){
tire = new Tire(size);
}
//初始化底盘
public void init(){
tire.init();
}
}
//轮胎类
static class Tire{
int size;
public Tire(int size){
this.size = size;
}
//初始化轮胎
public void init(){
System.out.println("初始化轮胎成功,size = "+this.size);
}
}
public static void main(String[] args) {
Car car = new Car(15);
car.init();
}
}
传统开发的缺陷:
当最底层的Tire类的构造方法发生变化时,整个调用链上的代码都需要因之改变,代码的耦合性很高。
3.2 控制反转式:
//汽车类
static class Car{
public FrameWork frameWork;//依赖车身
public Car(FrameWork frameWork){
this.frameWork = frameWork;
}
//初始化汽车
public void init(){
frameWork.init();
}
}
//车身类
static class FrameWork{
public Bottom bottom;//依赖底盘
public FrameWork(Bottom bottom){
this.bottom = bottom;
}
//初始化车身
public void init(){
bottom.init();
}
}
//底盘类
static class Bottom{
public Tire tire;//依赖轮胎
public Bottom(Tire tire){
this.tire = tire;
}
//初始化底盘
public void init(){
tire.init();
}
}
//轮胎类
static class Tire{
int size;
public Tire(int size){
this.size = size;
}
//初始化轮胎
public void init(){
System.out.println("初始化轮胎成功,size = "+this.size);
}
}
public static void main(String[] args) {
int size = 20;
Tire tire = new Tire(20);
Bottom bottom = new Bottom(tire);
FrameWork frameWork = new FrameWork(bottom);
Car car = new Car(frameWork);
car.init();
}
控制反转的优点:
控制反转的构建方式把传统的new对象的操作变为了在当前类中注入一个对象,此时,无论底层代码如何变化,整个调用链都不需要做任何调整,从而实现了代码之间的解耦。
3.3 对比总结
在传统的代码中,对象创建的顺序是:Car、Framework、Bottom、Tire;
控制反转式的代码中,对象创建的顺序是:Tire、Bottom、FrameWork、Car。
可以发现,控制反转式的代码中,对象的创建顺序和传统代码中的恰恰相反,上级类不再控制所依赖的下级类,而是把下级类的对象注入到当前对象中,这样即使下级类发生任何变化,都不会影响到当前的类,这就是典型的控制反转,也就是IoC的思想。
4、理解Spring IoC
既然Spring是一个IoC容器,那么它就具备容器最基本的两个功能:
a. 将对象存入到容器;
b. 从容器中取出对象。
即Spring最核心的功能,就是将对象存入到Spring中,从Spring中取出对象,既然对象都存入到Spring中了,那么对象的创建和销毁的权利都由Spring来管理了。
三、什么是DI
DI是Dependency Injection的缩写,即依赖注入的意思。依赖注入就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象中。
IoC和DI是同一概念的不同角度的描述,IoC是一种思想,而DI则是实现这种思想的一个方式。
比如乐观锁是一种思想,而CAS则是乐观锁的一种实现方式。