目录
一、什么是Spring?
1.1、什么是容器?
1.2、IoC是什么?
1.3、IoC带来了什么好处?
二、什么是DI?
2.1、IoC和DI有什么关系?
一、什么是Spring?
一句概括,Spring 是包含了众多⼯具⽅法的 IoC 容器;
那么什么是IoC?什么是容器?
1.1、什么是容器?
容器就是用来装某种物品的装置;例如我们所学的List,Map这种数据容器,生活中我们装水的容器杯子......
1.2、IoC是什么?
IoC——Inversion of Control,也就是控制反转,他并不是什么技术,而是一种设计思想;简单理解,IoC思想表达的含义就是把你设计好的对象交给容器来控制,而不是像传统的在对象内部进行控制;
何为控制?要控制什么?控制就是对象的创建、初始化、销毁;传统的,创建对象是new、初始化是同各国构造器或setter赋值、销毁对象我们会直接赋值null;IoC呢?现在所有权力交由给Spring容器,也就是说,现在Spring掌握了对象的生命周期,不再是我们程序员了,何为反转?想必以及心中有数了~,反转就是,我们由对象的控制者变成了IoC的被动接受者,对象的控制权由我们程序员交给了Spring,我们甚至无法预知,全听Spring的节奏;
举个栗子,同样是向水杯这个容器里加入水,我有两种不同的思路,一种是传统的, 一种是IoC的;
如下代码(传统的):
//杯子
class Cup {
private Goods goods;
public Cup(String one) {
this.goods = new Goods(one);
}
public void init() {
System.out.println("杯子初始化完成");
goods.init();
}
}
//放入杯子的物品
class Goods {
private String one;
public Goods(String one) {
this.one = one;
}
public void init() {
System.out.println("物品初始化为:" + one);
}
}
如下代码(IoC):
//杯子
class Cup {
private Goods goods;
public Cup(Goods goods) {
this.goods = goods;
}
public void init() {
System.out.println("初始化Cup");
goods.init();
}
}
//物品
class Goods {
private String one;
public Goods(String one) {
this.one = one;
}
public void init() {
System.out.println("物品初始化为:" + one);
}
}
我们来对比一下:
1.3、IoC带来了什么好处?
——解耦合~
若最顶层的代码进行了改动,如上案例中的Goods的参数进行了改动,由于Cup依赖于goods,所有Cup的代码也许要进行改动,那么一旦依赖链足够的长,整条链都要进行修改,十分麻烦;
通过IoC完美的解决了耦合问题,即使修改了Goods的参数也不会影响到Cup,因为Cup的创建只需要Goods这一整个类的注入(Goods内部具体实现Cup不用关注),甚至可以让两个完全不着边的类型产生注入关系;就如刚刚所讲的Cup杯子的代码案例:传统的代码Cup和good是依赖关系(创建Cup必须传入Goods的所需的参数),你不可能去创建或修改内部的依赖(假设由Spring包装好了);但是借助IoC,我们可以自己实现一个Goods类(上面代码案例中的)注入进去;
二、什么是DI?
DI—Dependency Injection,即“依赖注入”
一句概括,在程序运行期间,动态地将某种依赖关系注⼊到对象之中。
2.1、IoC和DI有什么关系?
IoC是一种设计思想,DI是具体实现技术,将这种理论思想变成了实践。例如:“今天学习真辛苦,准备吃顿好的,于是,晚上我去吃了火锅”;准备吃顿好的 就是目标和思想(IoC),晚上吃了火锅 就是具体实现(DI);具体的,你把依赖交给容器,容器帮你管理依赖,这就是依赖注入的核心,这样做,降低了开发的成本,提高了代码的复用率,提高了软件的灵活性;
要说具体的区别,emm 是有的,IoC强调的是容器中对象的控制权发生了发生反转,而DI强调的是动态的将依赖关系注入对象;广义上,IoC是一种软件开发模式,DI便是最深得人心的一种;