参考文献

什么是IoC?

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法;

  • 将对象的创建和组装的主动控制权都交给Spring容器来完成,使用这只需要从Spring容器中查找需要的使用的对象.
  • 主要是为了降低系统代码的耦合度,让系统利于维护和扩展.
  • Spring容器主要负责容器中对象的创建,组装,对象查找,对象生命周期的管理等等操作.

IoC容器的职责

  • 实现与执行的任务之间要解耦;
  • 实现bean的管理,让应用程序不用过渡关注bean的生命周期以及依赖;

img

  • IoC容器是具有依赖注入功能的容器,负责对象的实例化,对象的初始化,对象和对象之间依赖关系配置,对象销毁,对外提供对象的查找等操作,对象的整个生命周期都是由容器来控制.

通用职责

  • 依赖处理

    • 依赖查找
    • 依赖注入
  • 生命周期管理

    • 容器的生命周期(启动,停止…);
    • 托管的资源(Java Beans或其他资源的生命周期);
  • 配置

    • 容器的配置
    • 外部化配置
    • 托管的资源(Java Beans或其他资源)

如何实现IoC?

IoC主要实现策略

img

  • 使用服务定位模式(Service locator pattern)
    • Java EE 中使用的模式,一般通过 JNDI 技术获取Java EE组件,如获取 EJB 组件,或者DataSource相关数据源。
  • 依赖注入(Dependency injection)
    • 构造器注入
    • 参数注入
    • Setter注入
    • 接口注入
  • 上下文的依赖查询(ContextUalized lookup)
    • Spring 参考了Java Beans中的实现方式,Java Beans 中有一个通用的上下文 BeanContext,既可以传输Bean,又可以管理Bean的层次;
  • 模板方法(Template Method Design Pattern)
  • 策略模式(Strategy Design patten)

IoC的具体实现

  • Java SE
    • Java Beans
    • Java ServiceLoader SPI
    • JNDI(Java Naming and Directory Interface)
  • Java EE
    • EJB(Enterprise Java Beans)
    • Servlet
  • 开源
    • Apache Avalon
    • PicoContainter
    • Google Guice
    • Spring Framework

传统IoC容器的实现

  • Java Beans作为IoC容器
    • 特性
      • 依赖查找
      • 生命周期管理
      • 配置元信息
      • 事件
      • 自定义
      • 资源管理
      • 持久化

Spring IoC依赖来源

  • 自定义Bean(自己用XML配置或注解配置的Bean)
  • 容器内建Bean对象(非自己定义的B`ean,Spring容器初始化的Bean)
  • 容器内建依赖(非Bean,不能通过依赖查找获取,getBean(XX));
    • 通过AutowireCapableBeanFactory#resolveDependency()方法来注册,并非是一个Spring Bean,无法通过依赖查找获取;

Spring IoC配置元信息

  • Bean定义配置
    • 基于XML文件
    • 基于Properties文件
    • 基于Java注解
    • 基于JavaAPI
  • IoC容器配置
    • 基于XML文件
    • 基于Java注解
    • 基于Java API
  • 外部化属性配置
    • 基于Java注解 @Value

Spring 应用上下文

  • ApplicationContext除了IoC容器角色,还提供
    • 面向切面(AOP)
    • 配置元信息(Configuration MetaData)
    • 资源管理(Resources)
    • 事件(Events)
    • 国际化(il8n)
    • 注解(Annotations)
    • Environment对象(Environment Abstracttion)

使用Spring IoC容器

  • org.springframework.beans.factory.BeanFactory是Spring底层IoC容器
  • org.springframework.context.ApplicationContext是具备应用特征的BeanFactory超集