1. IoC 容器的概念

IoC 字面理解是 “控制反转”,核心是将对象的创建、管理(如生命周期、依赖关系)的控制权从业务代码转移到一个统一的容器(IoC 容器)。
  • 传统开发中,对象的创建和依赖关系由开发者手动控制(例如通过 new 关键字创建对象,直接在代码中硬编码依赖)。
  • 而在 Spring 中,IoC 容器(如 ApplicationContext)负责统一创建、存储、管理对象(即 Spring 中的 Bean),开发者只需通过配置(注解或 XML)声明对象及其依赖,容器会自动完成对象的初始化和组装。
可以理解为:原本是 “开发者主动创建依赖”,现在变成 “容器主动推送依赖”,控制权发生了反转。

2. DI 依赖注入的概念

DI 是 IoC 的具体实现方式,指容器在创建对象时,自动将其依赖的其他对象(Bean)注入到当前对象中,无需开发者手动设置依赖。
  • 例如:Service 层依赖 Mapper 层,传统方式需要在 Service 中手动 new Mapper();而通过 DI,Spring 容器会自动将 Mapper 对象 “注入” 到 Service 中(如通过 @Autowired 注解)。
  • 注入方式常见的有:构造器注入、setter 方法注入、字段注入(注解方式)。

3. 解决的核心问题

  • 降低耦合性:传统开发中,对象之间直接依赖(硬编码),修改一个类可能导致多个关联类需要修改(牵一发而动全身)。IoC 容器通过统一管理依赖,使对象之间仅通过接口交互,减少了直接依赖。
  • 提高代码复用性和可维护性:对象的创建和管理集中在容器中,避免了重复的 new 操作,且修改依赖关系只需调整配置,无需修改业务代码。
  • 便于测试:依赖由容器注入,在单元测试时可以轻松替换真实依赖为 Mock 对象(如 Mockito 模拟),降低测试难度。
  • 简化开发:开发者无需关注对象的创建细节(如复杂的构造过程、依赖传递),只需专注于业务逻辑实现。
总结:IoC 是一种设计思想(反转控制权),DI 是其实现手段,二者共同通过 “容器管理对象和依赖”,解决了传统开发中对象耦合紧密、难以维护的问题,是 Spring 框架实现 “松耦合” 的核心基础。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐