spring IoC思想概述

IoC(Inversion of Control,控制反转)是 Spring Framework 的核心设计思想之一,本质是:对象的创建与依赖关系的管理,从程序员手中转移到容器中(Spring容器)。


传统开发模式(控制未反转)

1
2
3
class UserService {
private UserDao userDao = new UserDao(); // 强耦合
}

问题:

  • 依赖关系写死(硬编码)
  • 无法灵活替换实现
  • 测试困难(无法Mock)
  • 不符合面向接口编程

IoC 模式(控制反转)

1
2
3
4
5
6
7
class UserService {
private UserDao userDao;

public UserService(UserDao userDao) {
this.userDao = userDao; // 外部注入
}
}

变化本质:

项目 传统方式 IoC方式
对象创建 自己 new 容器创建
依赖关系 硬编码 配置/注入
控制权 程序控制 容器控制

IoC 核心机制

IoC 在 Spring 中通过两个核心组件实现:

1.IoC 容器(BeanFactory / ApplicationContext)

  • 负责:

    • 创建对象(Bean)
    • 管理生命周期
    • 维护依赖关系

常见容器:

  • BeanFactory(基础容器)
  • ApplicationContext(增强容器,企业级使用)

2.2 依赖注入(DI,Dependency Injection)

IoC 的具体实现方式是 DI(依赖注入)

三种注入方式:

  1. 构造器注入(推荐)
  2. Setter 注入
  3. 字段注入(@Autowired)
1
2
3
4
5
@Service
class UserService {
@Autowired
private UserDao userDao;
}

IoC 工作流程(容器启动机制)

flowchart TD
    A[加载配置/扫描注解] --> B[解析Bean定义]
    B --> C[实例化Bean]
    C --> D[依赖注入]
    D --> E[初始化Bean]
    E --> F[放入容器缓存]
    F --> G[应用程序获取Bean]

关键阶段说明:

阶段 说明
BeanDefinition Bean 元数据描述
实例化 反射创建对象
依赖注入 自动装配
初始化 执行 init 方法
缓存 单例池

IoC 设计思想本质

控制反转的“反”是什么?

  • 反的是“控制权”

    • 原来:程序员控制对象创建
    • 现在:容器控制对象创建

核心目标

  • 解耦(Decoupling)
  • 可扩展(Extensibility)
  • 可测试(Testability)
  • 可维护(Maintainability)

IoC 在 Spring 中的体现

XML 配置(早期)

1
2
3
4
<bean id="userDao" class="com.demo.UserDao"/>
<bean id="userService" class="com.demo.UserService">
<property name="userDao" ref="userDao"/>
</bean>

注解方式(主流)

1
2
3
4
5
6
7
8
@Component
class UserDao {}

@Service
class UserService {
@Autowired
private UserDao userDao;
}

IoC 深层理解

本质是一个对象工厂 + 依赖图管理器

可以抽象为:

1
2
3
4
IoC Container =
Object Factory
+ Dependency Graph Resolver
+ Lifecycle Manager

与SRE/DevOps类比

IoC 云原生
Bean Pod
容器 Kubernetes
注入依赖 Service Discovery
生命周期 Pod Lifecycle

本质一致:调度 + 生命周期管理 + 解耦