IoC
IoC 是一种设计原则,用于减少代码之间的耦合。它通过将对象的创建和管理交给外部容器(如 Spring 容器)来实现,而不是由对象自己创建或管理它们所依赖的对象。
核心思想
控制反转:应用程序不再负责对象的创建和管理,而是将这些工作交给外部容器。
依赖管理:容器负责管理对象的生命周期以及它们之间的依赖关系。
BeanFactory:Spring 容器的基础接口,负责管理 Bean 的生命周期。
ApplicationContext:BeanFactory 的扩展,提供了更多的功能,如 AOP、事件处理等。
优点
解耦:减少代码之间的直接依赖,提高代码的可维护性和可测试性。
灵活性:可以方便地替换或修改依赖的实现。
DI
DI 是实现 IoC 的一种具体方式,通过外部容器将对象的依赖关系注入到对象中,而不是由对象自己创建或查找这些依赖。
注入方式
构造函数注入(Constructor Injection)
通过构造函数传递依赖。
适用于必须的依赖,保证对象在被创建时就已经具备了必要的依赖。
示例:
public class MyService {
private final MyRepository repository;
public MyService(MyRepository repository) {
this.repository = repository;
}
}
Setter 方法注入(Setter Injection)
通过 setter 方法传递依赖。
适用于可选的依赖,允许在对象创建后动态修改依赖。
示例:
public class MyService {
private MyRepository repository;
public void setRepository(MyRepository repository) {
this.repository = repository;
}
}
IoC 和 DI 的关系
IoC 是一个原则,指的是将控制权交给外部容器。
DI 是一种实现方式,通过注入依赖来实现 IoC。