IOC的基本概念
IOC 的全称是Inversion of Control,即控制反转。也可以理解为依赖注入(Dependency Injection)。
宗旨就是让别人为你服务。
在没有使用IOC容器之前,如果某个对象依赖于某个类或者服务,通常是在该对象中主动的去获取依赖的类。
public interface IBehavior {
public void sleep();
public void study();
public void work();
}
public class BehaviorImpl implements IBehavior {
@Override
public void sleep() {
System.out.println("sleep");
}
@Override
public void study() {
}
@Override
public void work() {
}
}
public class Person {
private IBehavior behavior;
public Person() {
}
public Person(IBehavior behavior) {
this.behavior = behavior;
}
public void sleep() {
behavior.sleep();
}
public IBehavior getBehavior() {
return behavior;
}
public void setBehavior(IBehavior behavior) {
this.behavior = behavior;
}
public static void main(String[] args) {
Person person = new Person();
person.setBehavior(new BehaviorImpl());
person.sleep();
}
}
譬如:有一个Person对象,依赖IBehavior的sleep()服务。通常做法,是通过我们主动现在获取到IBehavior对象,然后在调用sleep()服务。但是,我们是否有必要必须要通过主动获取的依赖对象呢?如果有第三方,将Person类在需要调用IBehavior的sleep ()服务时,在将IBehavior对象注入到Person对象中去,进而获取sleep()服务。
IOC主要的作用是在我们需要调用依赖对象的时候,为我们准备好所需要的依赖对象。而不需要我们主动的去获取依赖对象。
IOC注入方式
- 接口注入 ,基本上不提倡使用
- 构造器注入,就是被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是IoC容器)知道它需要哪些依赖对象。这种注入方式的优点是对象在构造完成时,就已经进入就绪状态可以马上使用。缺点:当依赖对象过多时,构造方法的参数列表比较长。通过反射构造对象时,比较困难。
- setter方法注入,缺点就是在对象构造完成时,无法立即进入就绪状态。
IOC的附加值
从主动获取依赖关系的方式转向IOC方式,不只是一个方向上的改变。通过IOC注入不会对业务对象构成很强的入侵性,使用IOC后,对象具有更好的可测试性、可重用性和可扩展性。