Spring 是什么?如何理解 Spring?
我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是个开源框架,有着活跃而庞大的社区,这就是它之所以能经久不衰的原因。Spring 支持广泛的应用场景,它可以让 Java 企业级的应用程序开发起来更简单。
用一句话概括 Spring:Spring 是包含了众多工具方法的 IOC 容器。
IOC 容器是什么?
计算机中的容器
我们先来谈谈容器是什么,在计算机中的容器,其实和我们日常所说的容器其实是一一回事。
在日常生活中,
书架的可以用来放书、衣柜可以用来放衣服、瓶子可以用来装水,它们都是容器,而容器就是可以用来容纳东西的东西。
在计算机领域中,
List / Map 是一个用来存储数据的容器,Tomcat 是一个放 Web 程序的容器。
IOC 容器
IOC:Inversion of Control ( 控制反转 )
基于 IOC 这样的思想,对于 Spring 框架来说,就是由 Spring 来负责控制对象的生命周期和对象间的关系。也就是说,Spring 这个 IOC 容器,说的是对象创建和销毁的权利都交给 Spring 来管理了,它本身具备了存储对象和获取对象的能力。
怎么理解上面的这句话呢?
举个例子:比方说,一家汽车公司需要根据用户的需求,来定制一辆车,刚开始用户说按汽车公司的设计来,只要达到他需要的车速即可,配置都按最高的来。但是,用户中途改变注意了,他想让汽车轮胎变大一些,用来跑越野,这时候汽车厂商原先设计的汽车底盘、框架、零件都作废了。因为刚开始的底盘、零件都是和轮胎配合好的,如果重新按设计轮胎大小的话,就会影响之前的定制,从而带来损失。
这有一种 " 牵一发而动全身 " 的感觉,而实际上,在传统 Java 程序中,都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难以测试、难以修改。
而有了 IOC 的思想后,对于刚刚的汽车公司的例子就是,公司按照零件的标准来,先根据不同的轮子,再采用不同的底盘和框架。公司并不是一下子就设计好一个完整的产品。而是,汽车厂商有什么样的标准,就按什么样的标准来。往后,用户需要什么尺寸的轮胎,公司直接向代理工厂下单,配套使用一类底盘,如果用户中途又改变选择了,这类底盘就不用了,再换一类其他的底盘,倒不至于之前的底盘和零件都因为一次定制都全部作废了。
上面的汽车厂商的例子就是,厂商需要什么零件,只需要和代理工厂说就好,不管代理工厂让什么员工去实现零件,这都和厂商没有关系,厂商只需要付钱给工厂,而代理工厂只需要交货并拿钱就行了。而汽车厂商只需要和用户打交道,用户有什么需求,厂商就需要按照其需求来即可。
这就带来了一个好处,用户与汽车厂商装配零件的来源没关系,汽车厂商与代理工厂的工人没关系…
所以综上所述,IOC 思想,最大的作用就是,解决了代码的耦合性。
Spring 最核心的功能是什么
因为 Spring 本质上就是一个 IOC 容器,那么它就具备两个功能:
- 将 Bean ( 对象 ) 存储到 Spring ( 容器 ) 中。
- 将 Bean ( 对象 ) 从 Spring ( 容器 ) 中取出来。
而实际上,Spring 最核心的功能也就是上面的两个功能,当然,也就是我们重点理解、重点学习 Spring 需要做的事情。
DI 是什么?IOC 和 DI 有什么区别?
DI:Dependency Injection ( 依赖注入 )
所谓依赖注入,就是由 IOC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入和控制反转是从不同的角度的描述的同一件事情。本质上,DI 就是指通过引入 IOC 容器,利用依赖关系注入的方式,实现对象之间的解耦。
IOC 和 DI 之间的区别
IOC 是一种思想,DI 是一种基于这种思想的实现。
实际上换句话说,IOC 是策划者,DI 是执行者。
比方说,今天我过生日,想去下饭馆,那么我就想去吃火锅," 去吃火锅 " 就是 IOC,那么市里面有很多火锅店,我究竟去哪家店呢?我究竟采取坐公交的方式去店里面、还是自己开车去店里面呢?这就可能根据个人口味、交通路况等一些情况再做决定了。那么后者,我需要动身去火锅店这个行动就是 DI.