IoC(控制反转)是一种设计原则,核心思想是将对象的创建和依赖管理交给外部容器,而非在代码内部直接控制。
IOC的实现方式分为依赖查找(DF)和依赖了注入(DI)
DI和DF区别
1. 主动性差异
- 依赖查找:对象主动调用容器API(如
getBean())获取依赖项,需要显式编码查找逻辑1 4 8。 - 依赖注入:依赖项由容器被动推送到对象中(如通过
@Autowired),无需显式查找代码1 6 10。
2. 代码侵入性
- 依赖查找:需在业务代码中嵌入容器API(如
ApplicationContext.getBean()),侵入性强1 4 9。 - 依赖注入:通过注解或配置声明依赖关系,代码无显式容器API调用,侵入性低1 6 10。
3. API依赖性
- 依赖查找:强依赖容器API(如Spring的
ApplicationContext),导致代码与容器绑定1 7 8。 - 依赖注入:不依赖容器API,仅通过接口或注解定义依赖,更易脱离容器测试1 7 11。
4. 可读性与灵活性
- 依赖查找:依赖关系在代码中显式体现,可读性更高4 5。
- 依赖注入:依赖关系通过配置或注解隐式绑定,灵活性更强但需注意潜在规则(如
@Autowired按类型/名称注入)1 6 9。
5. 适用场景
- 依赖查找:适合动态获取依赖(如插件化架构)或需精细控制依赖的场景1 8。
- 依赖注入:适合常规业务开发,提升模块解耦和可维护性2610。