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的顺序
- 对象在使用前可能是未初始化完全的
- 优点