一、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實現的關鍵。