一、Spring是什么?
我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。
如果用一句话来总结Spring,那就是:
Spring是包含了众多工具方法的IoC容器
那么问题来了,工具方法是什么?IoC是什么?容器又是什么?
工具方法我们以后再说,我们先来看看IoC和容器
二、什么是容器?
容器容器,肯定是要装东西的。其实我们之前学的List还有Tomcat都是容器,为啥这样说呢?
你看List/Map里面放的是不是都是数据,那他不就相当于是一个数据存储容器吗?
还有Tomcat,他里面不是有webapps这个目录,我们之前不都是把servlet项目代码放到webapp这个目录下吗?这个webapps不就是项目的容器吗?而这个webapps目录是Tomcat下面的一个子目录,那么我们把Tomcat称作是一个Web容器,完全没有问题呀!
三、什么是IoC?
初识
Spring也是一个容器,而且Spring就是一个IoC容器。
那么关键的来了,什么是IoC
IoC = Inversion of Control 翻译成中文就是控制反转的意思。
也就是说Spring是一个”控制反转“容器。
这个控制反转是什么意思呢?
你看,一般情况下,我们在A类中,想要去调用B类中的方法,是不是需要我们在A类中去实例化B类(new一个B类对象)然后再通过这个实例化出来的对象去调用B类中的方法。
也就是说,当前B类的控制权是再我们A类手中的,但是这样会带来一些问题(如耦合性过高),很多情况下,我们没必要用到谁就实例化谁,我们可以让”其他人“来操作(也能够满足我们的要求,同时这个时候B类的生命周期也与我们A类无关,我们不需要操心那么多,我们只要能拿到我们需要的就好)相当于我们把控制权交给了这个其他人,我们在需要用操作对象时候,让这个”其他人“来帮助我们来管理就好了。
谁调用A,谁就把A需要的B来传给,但B的生命周期与A类无关(这样即使B类发生了变化,A类也不用管)
这个“其他人”,就是 Spring 框架。
此时,我们想要 A 类中调用 B 的时候, 告诉 框架,我要在 A 中 调用 B 了。
至于 B 的生命周期,和我们没有任何关系。
这是控制反转。
前面说过: Spring 是一个 控制反转 的 容器。
也就是 像之前在传统开发的时候,所有需要我们自己去new东西,都不需要我们再去new 了。
因为我们把控制权 “反转给了” Spring 框架。
Spring 会帮我们管理所有的对象(Bean)
在 Spring 中,我们管 对象,叫做 Bean。
例子阐述IoC
下面我们结合一个具体的例子来看看IoC思想有什么好处?
假如,我们现在构建⼀辆“⻋”的程序,我们的实现思路是这样的
构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(BottomClass),⽽底盘需要依赖轮胎(Tire Class),最终程序的实现代码如下
这样有什么问题呢?
就是当我们的Tire的size需要改变的时候,从上到下,因为Bottom依赖Tire,所以Bottom要对应的改变;同时FrameWork又依赖着Bottom,那么FramWork也要做出对应的改变:同时Car又依赖着FrameWork,所以Car类也要做出必要的改变。
不信你看代码
这样下来从上到下都有改变,整个代码的耦合性太高了。
为啥会这样呢?
因为每个类中都⾃⼰创建下级类,自己把活都干了。当下级类发⽣改变操作,自己随着也要改变。
但这其实完全是没有必要的
比如我们在Car类中,我们需要的只是一个FrameWork对象,你给我们传一个FrameWork对象不就好了吗,我干嘛还要自己new一个对象呢?(new完后还有摊子事,真是吃力不讨好)