目录
何为Spring
1. 何为容器
2. 何为 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
这是对Spirng最核心的总结。 因此Spring是一个 IoC (控制反转)容器,所以它就具备了两个最基础的功能:
- 将对象(Bean)存入到容器(Spring)中;
- 从容器(Spring)中取出对象(Bean);
Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,(把对象的生命周期交给了 IoC容器) 它本身⼜具备了存储对象和获取对象的能⼒。
因此 Spring IoC 带来的优点就是:
- 使程序之间的耦合性更低了;
- 使用起来更加方便,因为不再需要手动去创建对象了,也不用再去关注这个对象背后的依赖关系了;
- 使用起来也更加高效;
4. 理解 DI
依赖注入,指的是在IoC容器运行期间(IoC容器可以用来存取对象),动态的将依赖的某个对象注入到当前类当中的这个行为;就比如,上述例子中,要创建一个University类,需要依赖于SHS对象,那么此时就可以从 IoC容器中,将一个 SHS对象注入到当前的 University类中;
依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情。IoC是一种 "思想",而DI是一种具体的实现。通过引入 IoC容器,利用依赖注入的方式,实现对象之间的解耦。
5. 总结
Spring 是什么?如何理解 Spring?
IoC 和 DI 是啥?有什么区别?
Spring 最核⼼的功能是啥?