目录
何为Spring
Spring是一个包含了众多工具方法的 IoC 容器;
1. 何为容器
此处的容器,就类似于我们生活中所说的容器,可以用来存储东西。例如:List便是一个存储数据的容器,Tomcat是一个 Web容器;同样的,Spring也是一个容器。
2. 何为 IoC
IoC -> Inversion of Control,也就是控制反转的意思,因此 Spring 是一个 "控制反转" 的容器。
下文再对 IoC 进行解析:
2.1 传统的程序开发:耦合性太高
在学习 Spring 之前,我们常用的创建对象的方法就是去 new一个对象。但是这种传统的方法存在一个缺陷,就是类与类之间的耦合性太高了。例如此处举个例子,"一个人读书,得先读初中,再读高中,最后才读大学,因此,如果要创建一个大学对象,就得先创建一个高中对象,创建一个高中对象,就得先创建一个初中对象"
而这个程序是写死的,它的思维模式是固定的,如果想要对这个学生进行信息的添加,就例如添加一个参数:(学生读初中时的年龄),那么代码可想而知,是要进行大调整的。要从最底层的JSH类进行修改,依次往上修改。如下所示:
因此,针对这个问题,可以做出如下优化:
2.2 解决传统开发中的缺陷
可以尝试不在当前类中创建下级类,也就是不在University类中去创建SHS类,不在SHS类中去创建JHS类,因为这样的话,如果是参数需要变动,每一个类就需要做出调整,耦合性就太高了;
此时,我们只需要将原来由⾃⼰创建的下级类,改为传递的⽅式 (也就是注⼊的⽅式),也就是从自身类以外去获取这个对象,因为我们不需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦。
然后通过 Test 类来测试:
package newExample;
public class Test {
public static void main(String[] args) {
JHS jhs = new JHS(15);
SHS shs = new SHS(jhs);
University university = new University(shs);
university.init();
}
}
可以看出,此处的优化结果:如果是要增加或者删除参数,就不再需要大振旗鼓的去进行调整了,只需要对测试类中实例化对象的参数进行修改,以及这个类对应的属性进行修改就可以了。中间调用过程的类也就不再需要每一个都去修改了,也就大大降低了类与类之间的耦合性。
2.3 对比总结:IoC的实现思想
此处再做出对比:
可以发现,在传统的开发中,是University类控制并创建了SHS对象,SHS类控制并创建JHS对象,而改进之后,控制权发生了反转,不再是上级对象控制下级对象了,而是下级对象把自己注入到上级对象中,下级对象的控制权不再由上级对象控制了。此时如果下级类发生了属性的变化,当前的所有类都是不受影响的,这也就是 IoC 的实现思想,控制权的反转。
3. 理解Spring IoC
Spring 是一个包含了众多工具方法的 IoC容器。
这是对Spirng最核心的总结。 因此Spring是一个 IoC (控制反转)容器,所以它就具备了两个最基础的功能:
- 将对象(Bean)存入到容器(Spring)中;
- 从容器(Spring)中取出对象(Bean);
将Bean对象存放到容器中,就相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。而传统的开发方式,每一次需要的时候,再去new,就相当于需要每次需要某个工具的时候,才去制作,用完就扔掉,不会保存,下次需要的时候还得重新做,这也就是 IoC容器和普通程序开发的区别。
因此 Spring IoC 带来的优点就是:
- 使程序之间的耦合性更低了;
- 使用起来更加方便,因为不再需要手动去创建对象了,也不用再去关注这个对象背后的依赖关系了;
- 使用起来也更加高效;
4. 理解 DI
DI -> Dependency Injection,表示的是 "依赖注入";
依赖注入,指的是在IoC容器运行期间(IoC容器可以用来存取对象),动态的将依赖的某个对象注入到当前类当中的这个行为;就比如,上述例子中,要创建一个University类,需要依赖于SHS对象,那么此时就可以从 IoC容器中,将一个 SHS对象注入到当前的 University类中;
依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情。IoC是一种 "思想",而DI是一种具体的实现。通过引入 IoC容器,利用依赖注入的方式,实现对象之间的解耦。
5. 总结
Spring 是什么?如何理解 Spring?
spring是一个非常流行的开源框架,包含了众多工具方法的 IoC 容器,因此包含了两个最基础的操作,将bean存储到spring中,从spring中取出来bean对象,spring最核心的就是 IoC。
IoC 和 DI 是啥?有什么区别?
IoC 控制(权)反转,DI 依赖注入,他们两是从不同维度去分析同一件事,(先从相同点回答,再说不同点),IoC是一个思想,DI是当去运行的时候,动态地将某个依赖拿到当前的框架当中,是具体的实现。
Spring 最核⼼的功能是啥?
spring最核心的部分是 IoC容器,IoC最基本的操作就是存对象和取对象。