前言
Spring中IoC是一个很重要的思想,贯穿了整个Spring Framework,可以说是Spring中的核心思想
什么是IoC
IoC:Inversion of Control,控制反转,是面对对象的一种设计原则
什么是控制反转呢?从字面上看,是将反转了事物的控制权,通俗说:
不用自己创建对象,将创建操作交给容器,由容器注入到我们需要的地方
我们从主动创建对象,到被动接受对象,不用自己创建,这就是反转
Spring框架中,由Spring IoC容器来负责控制对象的生命周期和对象间的关系
这是一种设计模式,只是出现的比较晚,没有在Gof中
主动
在学习Java基础的过程中,我们一直都是主动的去创建对象,然后使用对象
举一个简单的例子,我们想要喝啤酒
主动方法:自己new一个啤酒,就可以喝了
啤酒类Beer:
package com.learn.pojo;
public class Beer {
public void toDrink(){
System.out.println("喝啤酒");
}
}
人Person:
package com.learn.pojo;
public class Person {
private Beer beer= new Beer();
public void drink(){
beer.toDrink();
}
}
测试:
package com.learn.pojo;
public class Test{
public static void main(String[] args) {
new Person().drink();
}
}
这样就可以喝到啤酒了,类似与我们自己制作了啤酒
简单,但是耦合度太高了,是我们主动去依赖了一个啤酒类
依赖反转,被动
当我们去一个酒吧,叫服务员,服务员就会把啤酒给我们,不需要我们手动去自己弄一杯啤酒
这就是控制反转,由容器注入给我们需要的地方
修改一下上面的类:
Person类:
package com.learn.pojo;
public class Person {
private Beer beer;
public void setBeer(Beer beer) {
this.beer = beer;
}
public void drink(){
beer.toDrink();
}
}
我们提供了setter方法注入(实际上Spring还可以构造器注入)
由服务员Waiter帮我们注入:
package com.learn.pojo;
public class Waiter {
public void injection(Person person){
Beer beer = new Beer();
person.setBeer(beer);
}
}
现在我们的就可以不用自己创建对象了
package com.learn.pojo;
public class Test {
public static void main(String[] args) {
Waiter waiter = new Waiter();
Person person = new Person();
waiter.injection(person);
person.drink();
}
}
在这个例子中,好像更繁琐了?不仅类的内容多了,还多了个Waiter
这一切都是为了解耦合,将对象的创建隐藏,我们只需要关注我们的业务即可
而且Spring的IoC容器是很精妙的,完全封装,程序员只需要调用API
依赖查找(DL)、依赖注入(DI)
既然有了IoC思想,那么就需要去实现IoC思想
Spring提供了依赖查找(Dependency Lookup)、依赖注入(Dependency Injection)两种技术
依赖查找(Dependency Lookup):容器中的受控对象通过容器的API来查找自己所依赖的资源和协作对象。这是一种比较传统的IoC实现方式,已经几乎淘汰,因为侵入性,使用到了容器的API,造成了我们无法在容器外使用和测试对象
依赖注入(Dependency Injection):依赖注入就是将服务注入到使用它的地方。对象只提供普通的方法让容器去决定依赖关系,容器全权负责组件的装配,可以通过Setter方法或者构造器注入
我们前面的例子就是依赖注入
总结
IoC:控制反转,是将对象的创建隐蔽,反转了获得依赖对象的方式
实现IoC有两种方式:依赖查找、依赖注入
依赖查找因为需要调用容器的API,侵入式的,已经几乎被淘汰了
依赖注入是由容器决定依赖关系,容器复制将需要注入的对象注入
一切都是为了解耦合
关于IoC网上有许多见解,仁者见仁智者见智
学海无涯苦作舟
都看到这了,点个赞呗(^_−)☆