目录
前言:
Spring是什么
什么是IoC
传统开发思想
IoC开发思想
Spring IoC
什么是DI
小结:
官网中提出:Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world's most popular Java framework.
Spring 使编程 Java 对每个人来说都更快、更容易、更安全。Spring专注于速度、简单性和生产力使其成为全球最受欢迎Java 框架。
Spring是包含众多方法的IoC容器。这句话怎么理解呢?什么是容器?什么又是IoC?
Java中也有一些容器,比如ArrayList,LinkedList,HashMap等等一些集合。这些集合其实就是容器。当我们使用这些集合类的时候,直接就可以使用集合为我们提供的一些方法。它把我们常用的操作都封装到集合中了,我们只需要明确集合为我们提供的方法就可以使用各种集合了。
Spring IoC容器最核心的操作就是存储和获取(动态注入DI)对象。在Spring中将这样的对象称为bean。只要一个对象需要多处使用,那么这个对象就是bean。
IoC: Inversion of Control(控制反转)。这是一种思想,控制权反转。
这样的思想可以降低模块之间的耦合性。所谓耦合性就是代码之间的相关性,如果耦合太高,那么可能修改一处代码其他所依赖的代码都需要修改。降低耦合性,即代码之间的相关性也就降低了,模块和模块之间的区别也就更加明显了,开发效率也就提高了。
Car类依赖了Framework类,就在自己类中实例了这个对象。Framework类依赖了Bottom类,也在自己类中实例了这个对象。Bottom类中依赖了Tire类,也在自己类中实例了这个对象。Tire为最底层的类,如果这个类中的构造方法改变了,那么其他所依赖一连串的类都需要修改代码。
如果当前类中依赖了其他类,就直接在自己类中实例这个对象了。那么就是自己控制着依赖对象的生命周期。所谓IoC思想就是控制反转,即我自己需要依赖这个对象的时候,不在自己类中实例这个对象了,自己不控制了。当我要使用这个依赖对象的时候,给别人说,让别人给我传递(注入)过来,即所依赖对象的生命周期不在是我自己控制了,交给别人控制(控制反转)。
这样的设计思想,就算所依赖的对象中代码进行了修改,也不会影响到当前类中的代码。当前类只需要得到依赖对象进行使用即可。
明显可以看到当前类所依赖的对象不在是我自己实例化了,而是由别人传递过来(控制反转),我只需要使用即可。生命周期不在是我自己控制了,而是交给了别人。相比于传统开发思想,代码的耦合性就降低了。
这样的模式下,就算依赖对象代码修改了,也不会影响到当前类中的代码。当前类只需要关注所依赖对象的使用即可。
IoC思想模式下依赖对象实例的顺序:Tire --> Bottom --> Framework --> Car。传统模式下依赖对象实例顺序:Car --> Framework --> Bottom --> Tire。明显也可以感受到控制权的反转。
Spring 是一个 IoC 容器,说的是对象的创建和销毁的权利都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。
IoC控制权反转。当自己类中需要所依赖的类的时候,不在自己类中实例这个类了(自己不控制)。当我需要时,我给别人说,由别人将这个类的实例传递(注入)过来,我直接使用即可。这个时候所依赖类的实例生命周期不在是我自己掌控了,而是交给别人(控制权反转)。这样就可以降低代码之间的耦合性,所依赖的类就算改变也不会影响当前类中的代码。
Spring容器中的对象默认只需要实例一次,以后使用的时候直接从Spring中获取就可以了。用完后在交给Spring容器。程序效率就得到了提升。
DI: Dependency Injection。就是依赖注入的意思。IoC是一种思想(控制权反转),Spring IoC是一个容器,包含了存储和获取对象的能力。获取对象就是程序在运行期间,动态的将对象注入到当前类中。
所谓依赖注入,就是当Spring IoC容器在运行期间,动态的将依赖关系注入到对象之中。IoC和依赖注入是从不同角度描述同一件事。当Spring IoC容器在运行的时候,使用DI技术动态的将目前所依赖的对象注入到当前要使用的位置上。实现对象之间的解耦。
Spring IoC是一种思想,自己容器控制着对象。当其他类要使用Spring IoC容器中对象依赖的时候,使用DI动态的将这个对象注入到目标位置。
IoC 是“目标”也是⼀种思想,而目标和思想只是⼀种指导原则,最终还是要有可行的落地方案,而DI就属于具体的实现。
Spring Ioc是一种思想,而DI是一种技术。使用Spring Ioc容器在程序运行期间动态的将对象注入到目标位置,这就是DI。