2. 重新认识 IOC
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫依赖查找(Dependency Lookup)。
为什么需要 IOC ?
因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。
2.1 IOC 发展简介
2.2 IOC 主要实现策略
- 依赖注入:构造器注入,参数注入,Setter 注入,接口注入
- 依赖查找
- 模板方法模式
- 策略模式
2.3 IOC 容器的职责
- 依赖处理
- 依赖查找
- 依赖注入
- 生命周期管理
- 容器
- 托管的资源,Java Bean 或其他资源
- 配置
- 容器
- 外部化配置
- 托管的资源,Java Bean 或其他资源
2.4 IOC 容器传统实现
POJO 类需要有属性,以及 Setter/Getter 方法,称为可写方法(Writeable)和可读方法(Readable)
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
// 补充: BeanInfoDemo 代码,见视频 p17
2.5 轻量级实现
- 容器可以管理代码的运行,生命周期
- 容器可以快速启动
- 容器不需要任何特殊的配置,而 EJB 需要
- 容器能够做到清垃圾的内存占用和最小化的 API 依赖
2.6 依赖查找与依赖注入
| 类型 | 依赖处理 | 实现 | 代码侵入性 | API 依赖性 | 可读性 |
|---|---|---|---|---|---|
| 依赖查找 | 主动获取 | 繁琐 | 侵入业务逻辑 | 依赖容器API | 良好 |
| 依赖注入 | 被动提供 | 便利 | 低侵入性 | 不依赖容器API | 一般 |
@Autowired 就是一种低侵入性的注入,如果使用 xml 方式注入,则是零侵入性
2.7 构造器注入与Setter注入
2.8 面试题
-
什么是 IOC ?
IOC 就是控制反转,类似于好莱坞原则,主要有依赖查找和依赖注入两种实现
-
依赖注入和依赖注入的区别?
依赖查找是主动的查找方式,通过名称类型或者路径去查找,需要显式调用容器的 API,获得想要的资源。依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和 API,代码侵入性低
-
Spring 作为 IOC 容器有什么优势?