Spring
Spring 指的是 Spring Framework ,翻译过来就是Spring框架。是一个支持广泛应用场景的开源框架。
而其功能可以用一句话总结:“Spring是包含了众多工具方法的Ioc的容器”
- 容器:容器是 来容纳某种物品的(基本)装置 --- (百度百科)
- Spring 是Web容器
- List/Map 是数据存储容器
- Spring是一个IoC容器
IoC
定义
全拼:Inversion of Control 翻译: "控制反转"。
其实IoC是一种思想,一个重要的面向对象的法则,它能指导我们如何设计出松耦合,更优良的程序。
对IoC的代码理解
假设我们对一个物品进行包装 物品(外包装-->内包装--->产品)。他们之间具有 耦合关系
- 传统思想写这个代码,创建三个类
public class Product { int size;//物品的大小 public Product(int size) { this.volume = size; } } ---------------------------------------------------------- public class InnerPacking { int size; public InnerPacking(int size) { Product product = new Product(size); } } ---------------------------------------------------------- public class OuterPacking { int size; //我自己造一个对象 public OuterPacking(int size) { InnerPacking innerPacking = new InnerPacking(size); } } ---------------------------------------------------------- //使用main方法 new 一个 拥有内外包装的物品 public static void main(String[] args) { OuterPacking outerPacking = new OuterPacking(10); }
- 使用IoC思想 去解决这个问题
public class Product { int size;//物品的大小 public Product(int size) { this.size = size; System.out.println("Product完成"); } } ---------------------------------------------------------- public class InnerPacking { Product product; public InnerPacking(Product product) { this.product = product; System.out.println("InnerPacking完成"); } } ---------------------------------------------------------- public class OuterPacking { InnerPacking innerPacking; //你给我一个对象,我对这个对象进行操作 public OuterPacking(InnerPacking innerPacking) { this.innerPacking = innerPacking; System.out.println("OuterPacking完成"); } } ---------------------------------------------------------- public static void main(String[] args) { //假设我们在这里我们做一个完整包装的产品(new 一个拥有双层包装的产品) Product product = new Product(12); InnerPacking innerPacking = new InnerPacking(product); OuterPacking outerPacking = new OuterPacking(innerPacking); }
这两种大致对比而言:
- 老思想:A需要B ,A自己去造一个类
- IoC:A需要B,你给我传一个B
注入方式(传递方式)发生了改变,由注入属性自己造 变成 直接注入类,而这种改变就使得程序进行解耦,对应到现实生活中,我们可以把产品外包给包装厂,我们不用管颜色,包装纸的大小等等东西,而包装厂只需要我们的产品即可。
在大型项目中,这种思想是非常重要的,如果传统的方式,改一个小东西大片代码都需要改动,而IoC思想改动需要改动的部分即可。
这就是一种降低耦合的代码思想,这种思想称之为 IoC,意为“控制反转”。
- 反转:容器来帮忙创建及注入依赖对象
- 正转:在对象中主动控制去直接获取依赖对象
DI
DI 是 Dependency Injection 的缩写,翻译是“依赖注入”的意思。
广义上来讲,DI 等同于 IoC,但是IoC 是“目标”也是一种思想,而目标和思想只是一种指导原则,最终还是要有可行的落地方案,而 DI就属于具体的实现。
IoC (控制反转) 这种解耦合的思想,可以通过DI (依赖注入)的方式实现。
举个生活例子来说就是:生病了吃药(指导思想) 感冒就喝999感冒灵颗粒(具体方案实现)
再看Spring
当我们大概的了解了 IoC 控制反转 DI 依赖注入 这些名词的时候
我们再回过头来看定义:“Spring是包含了众多工具方法的Ioc的容器”
上述的代码 我们感受到了 IoC思想,而Spring 就是 IoC 的容器,也就是我们一直提到的 控制权从程序员到容器。
在学习Spring之前,我们写一个项目,如果A需要使用到B,那么我们自己就new object() 把对象给创建出来,而Spring框架就不需要,Spring这个容器会有我们使用的B,只需要在这个容器中直接把B拿出来使用即可,Spring是怎么创建这个B,什么时候创建的B都不需要我们操心,A中也不需要管一些创建B的细节问题,A只管用B就完了。
也就是说 以前的我们自己创建,我们控制一切,用了Spring以后,容器操心,我们只管用。
控制的什么反转了 ? 获得依赖对象的方式反转了。自己获得 和 直接拿的区别。