一、IoC 核心概念
1. 控制反转(Inversion of Control)
传统编程中对象自行管理依赖(主动创建),而IoC将控制权转移给容器,由容器负责对象的创建、装配和管理,实现依赖关系的反向控制。
2. 依赖注入(Dependency Injection)
IoC的核心实现方式,通过构造函数、Setter方法或接口注入依赖,而非由对象主动查找或创建依赖。
二、核心原理
1. 容器架构
graph TDA[客户端] --> B[IoC容器]B --> C[Bean定义注册]B --> D[依赖解析]B --> E[生命周期管理]C --> F[XML/注解/JavaConfig]D --> G[类型匹配/自动装配]E --> H[初始化/销毁回调]
2. 核心组件
- BeanFactory:基础容器,提供DI支持
- ApplicationContext:扩展容器,集成AOP、事件等
- BeanDefinition:存储Bean的元数据(类名、作用域等)
3. 工作流程
- 资源定位:扫描XML/注解配置
- 加载解析:生成BeanDefinition
- 注册存储:存入BeanDefinitionRegistry
- 依赖注入:处理@Autowired等注解
- 初始化:调用@PostConstruct方法
- 提供服务:通过getBean()获取实例
三、关键实现机制
1. Bean生命周期
实例化 → 属性填充 → BeanNameAware → BeanFactoryAware
→ ApplicationContextAware → PreInitialization
→ @PostConstruct → InitializingBean → init-method
→ 使用期 → @PreDestroy → DisposableBean → destroy-method
2. 依赖注入方式
注入方式 | 实现类 | 特点 |
---|---|---|
构造器注入 | ConstructorResolver | 强依赖、不可变 |
Setter注入 | BeanWrapperImpl | 可选依赖、灵活性高 |
字段注入 | AutowiredAnnotationBeanPostProcessor | 代码简洁,但破坏封装性 |
3. 循环依赖解决
- 三级缓存:
singletonFactories
(未完成初始化的Bean)
earlySingletonObjects
(早期引用)
singletonObjects
(完整Bean)
四、设计价值
- 解耦:对象间通过接口交互,不关注具体实现
- 可测试性:依赖可Mock,便于单元测试
- 可扩展性:通过配置修改实现类,无需改代码
- 统一管理:集中控制对象生命周期和配置
五、典型应用场景
// 传统方式(紧耦合)
public class OrderService {private UserService userService = new UserServiceImpl();
}// IoC方式(松耦合)
public class OrderService {@Autowired private UserService userService;
}
六、源码实现要点
- DefaultListableBeanFactory:核心注册与获取实现
- AbstractAutowireCapableBeanFactory:Bean创建与注入
- AnnotationConfigApplicationContext:注解驱动容器
- BeanPostProcessor:扩展点(如AOP代理生成)
总结:
Spring IoC 通过容器托管对象生命周期和依赖自动注入,实现了组件间的松耦合。其核心价值在于将对象关系的维护从代码中剥离,通过配置声明依赖,使得系统更易维护和扩展。理解其反射机制、缓存策略和扩展点设计是掌握IoC实现的关键。