0%

Spring-Ioc简介

IoC发展简介

RIchard 1983年提出好莱坞原则 -> 1988年提出控制反转 -> Martin Fowler 2004年提出IoC及DI的理解

IoC主要实现策略

  • 依赖查找
  • 依赖注入
    • 构造器注入
    • 参数注入
    • set注入
    • 接口注入

IoC容器的职责

  • 实现与执行的任务之间的解耦
  • 专注于业务实现
  • 减少模块之间的关联,不需要知道其他模块的实现方式
  • 好莱坞原则
  • 通用职责
  • 依赖处理
    • 依赖查找
    • 依赖注入
  • 生命周期管理
    • 容器
    • 托管的资源(Java Beans或其他资源)
    • 配置
  • 容器
    • 外部化配置
    • 托管的资源(Java Beans或其他资源)

IoC容器的实现

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

传统IoC容器的实现

  • Java Beans
    • 特性:
      • 依赖查找
      • 生命周期管理
      • 配置元信息
      • 事件
      • 自定义
      • 资源管理
      • 持久化
  • 规范
    • JavaBeans
    • BeanContext

轻量级IoC容器

  • 轻量级容器的特征

    • 容器可以管理代码的运行
    • 快速启动
    • 不需要特殊的发布步骤
    • 轻量级的内存占用,最小化API依赖
    • 可管理
  • 优点

    • 最大化代码复用
    • 更好的面向对象
    • 更好的产品化
    • 更好的测试性

依赖查找 VS 依赖注入

类型 依赖处理 实现便利性 代码侵入型 API依赖性 可读性
依赖查找 主动获取 相对繁琐 侵入业务逻辑 依赖容器API 良好
依赖注入 被动提供 相对便利 低侵入性 不依赖容器API 一般

构造器注入 VS Setter注入

Spring团队推荐使用构造注入

  • 构造器注入

    • 优点

      • 完全初始化的对象,对象更安全且更易维护
      • 减少代码量
    • 缺点

      • 通用性降低
      • 构造器名称语义可读性差
      • 太多参数会使代码不整洁
      • 继承问题
      • 可选参数支持性差
      • 测试困难
      • 对象构造完成后,参数不可变
  • setter注入

    • 优点
      • JavaBeans IDE支持更好
      • JavaBeans 属性是自文档的方式
      • 可以做一些类型转换
      • 可以修改属性值
    • 缺点
      • 没有办法确认set的顺序
      • 对象在使用前可能是未初始化完全的