Spring(02)重新认识 IoC
Spring(02)重新认识 IoC
目录
1. IoC 发展简介
- 1983年,Richard E. Sweet 在《The Mesa Programming Environment》中提出 “Hollywood Principle”(好莱坞原则)
- 1988年,Ralph E. Johnson & Brian Foote 在《Designing Reusable Classes》中提出 “Inversion of control”(控制反转)
- 1996年,Michael Mattsson 在《Object-Oriented Frameworks, A survey of methodological issues》中将“Inversion of control”命名为“Hollywood principle”
- 2004年,Martin Fowler 在《Inversion of Control Containers and the Dependency Injection pattern》中提出了自己对 IoC 以及 DI 的理解
- 2005年,Martin Fowler 在《Inversion Of Control》对IoC 做出进一步的说明
2. IoC 主要实现策略
维基百科(https://en.wikipedia.org/wiki/Inversion_of_control)
Implementation techniques 小节的定义:
In object-oriented programming, there are several basic techniques to implement inversion of control. These are:
- Using a service locator pattern(SPI)
- Using dependency injection, for example(依赖注入)
- Constructor injection(构造器注入)
- Parameter injection(参数注入)
- Setter injection(setter 方法注入)
- Interface injection(接口回调)
- Using a contextualized lookup(依赖查找)
- Using template method design pattern(模板方法)
- Using strategy design pattern(策略模式)
3. IoC 容器的职责
- 依赖处理
- 依赖查找
- 依赖注入
- 生命周期管理
- 容器
- 托管的资源(Java Beans 或其他资源)
- 配置
- 容器
- 外部化配置
- 托管的资源(Java Beans 或其他资源)
4. IoC 容器的实现
- Java SE
- Java Beans
- Java ServiceLoader SPI
- JNDI(Java Naming and Directory Interface)
- Java EE
- EJB(Enterprise Java Beans)
- Servlet(eg: Tomcat、Jboss)
- 开源
- Apache Avalon:http://avalon.apache.org/closed.html
- PicoContainer:http://picocontainer.com/
- Google Guice:https://github.com/google/guice
- Spring Framework:https://spring.io/projects/spring-framework
5. 传统 IoC 容器实现
Java Beans 作为 IoC 容器
- 特性
- 依赖查找
- 生命周期管理
- 配置元信息
- 事件
- 自定义
- 资源管理
- 持久化
- 规范
6. 轻量级 IoC 容器
7. 依赖查找VS. 依赖注入
类型 | 依赖处理 | 实现便利 | 侵入性 | API依赖性 | 可读性 |
---|---|---|---|---|---|
依赖查找 | 主动获取 | 相对繁琐 | 侵入业务代码 | 依赖容器API | 良好 |
依赖注入 | 被动提供 | 相对便利 | 低侵入 | 不依赖容器API | 一般 |
8. 构造器注入 VS. Setter 注入
- 构造器注入只能根据参数的顺序执行,而 Setter 注入则是无序。
- 构造器注入可以将字段设置为 final,保证一致性。
- 很多时候,我们希望 bean 一旦初始化后就不能被修改,此时可以使用构造器注入。
9. 面试题精选
问题1:什么是 IoC ?
答:简单地说,IoC 是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现。
问题2:依赖查找和依赖注入的区别?
答:依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准 API 实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和 API。
问题3:Spring 作为 IoC 容器有什么优势?
答:Spring 优势有
- 典型的 IoC 管理,依赖查找和依赖注入
- AOP 抽象
- 事务抽象
- 事件机制
- SPI 扩展
- 强大的第三方整合
- 易测试性
- 更好的面向对象
每天用心记录一点点。内容也许不重要,但习惯很重要!