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)
- 开源
5. 传统 IoC 容器实现
Java Beans 作为 IoC 容器
- 特性
- 依赖查找
- 生命周期管理
- 配置元信息
- 事件
- 自定义
- 资源管理
- 持久化
- 规范
6. 轻量级 IoC 容器
7. 依赖查找VS. 依赖注入
| 依赖查找 |
主动获取 |
相对繁琐 |
侵入业务代码 |
依赖容器API |
良好 |
| 依赖注入 |
被动提供 |
相对便利 |
低侵入 |
不依赖容器API |
一般 |
8. 构造器注入 VS. Setter 注入
- 构造器注入只能根据参数的顺序执行,而 Setter 注入则是无序。
- 构造器注入可以将字段设置为 final,保证一致性。
- 很多时候,我们希望 bean 一旦初始化后就不能被修改,此时可以使用构造器注入。
9. 面试题精选
问题1:什么是 IoC ?
答:简单地说,IoC 是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现。
问题2:依赖查找和依赖注入的区别?
答:依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准 API 实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和 API。
问题3:Spring 作为 IoC 容器有什么优势?
答:Spring 优势有
- 典型的 IoC 管理,依赖查找和依赖注入
- AOP 抽象
- 事务抽象
- 事件机制
- SPI 扩展
- 强大的第三方整合
- 易测试性
- 更好的面向对象
每天用心记录一点点。内容也许不重要,但习惯很重要!
Spring(02)重新认识 IoC
原文:https://www.cnblogs.com/binarylei/p/12290197.html