手写IOC- 基本概念

835 阅读3分钟

控制反转和依赖注入

控制反转(IOC),依赖注入(DI)

什么是控制反转?简单的说,控制反转就是一种思想,目的是将对象的创建由主动变成被动。 下面的实例就是主动new了一个对象。

public class Service{
    public DependObject object1 = new DenpendObject();
}

那么如何做到不使用new呢?依赖注入便是其中一种实现方式。

依赖注入的方式有三种

  • 构造器注入
  • setter注入
  • 接口注入
public class Service{
    public DependObject object;

    // 构造器注入
    public Service (DependObject obj){
        this.object = obj;
    }

    // setter注入
    public void setDependObject(DependObject obj){
        this.object = obj;
    }
}

可以看到,对象的生命周期不再由Service类中主动创建,而是通过注入的方式赋值。 顺便比较一下3中方式的优劣:

  • 接口注入: 从注入方式的使用上来说,接口注入是现在不甚提倡的一种方式,基本处于“退 役状态”。因为它强制被注入对象实现不必要的接口,带有侵入性。而构造方法注入和setter 方法注入则不需要如此。
  • 构造方法注入: 这种注入方式的优点就是,对象在构造完成之后,即已进入就绪状态,可以 马上使用。缺点就是,当依赖对象比较多的时候,构造方法的参数列表会比较长。而通过反 射构造对象的时候,对相同类型的参数的处理会比较困难,维护和使用上也比较麻烦。而且 在Java中,构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能需要引入多 个构造方法,而参数数量的变动可能造成维护上的不便。
  • setter方法注入: 因为方法可以命名,所以setter方法注入在描述性上要比构造方法注入好一些。 另外, setter方法可以被继承, 允许设置默认值,而且有良好的IDE支持。缺点当然就是对象无 法在构造完成后马上进入就绪状态。

IOC容器

为了所有对象的统一管理,需要有一个角色负责将这些相互依赖的对象绑定到一起,IOC容器就是这样一个角色。它的主要职责可以分为两个:

  1. 业务对象的构建管理:例如如何加载类,管理类的生命周期等。
  2. 业务对象间的依赖绑定:提供构建好的对象给业务方使用。 总结就是创建和绑定

IOC容器如何知道管理哪些对象呢?本系列将实现两种方式:1.使用编码申明,2. 使用注解@Bean声明,熟悉Spring的知道常用的还有XML的方式,这个可以自行实现。

在Spring中,使用Bean的概念表示IOC管理的对象,在这里依然采用这种定义方式,下篇文章介绍IOC模块的结构设计。

拓展阅读

对IOC的基本概念不熟悉的可以阅读: 《spring揭密》2.1 IOC基本概念