Spring IoC(控制反转)是Spring框架的核心机制,其原理是通过容器管理对象生命周期和依赖关系,实现解耦。
1. 控制反转(IoC)核心思想
- 传统模式:对象主动创建依赖(如
new Service()
),导致高耦合。 - IoC模式:将对象创建和依赖注入的控制权交给容器,开发者只需声明依赖关系。
- 数学描述:设对象集合为O={o1,o2,…,on}O = \{o_1, o_2, \dots, o_n\}O={o1,o2,…,on},依赖关系为有向图G=(O,E)G = (O, E)G=(O,E),容器通过拓扑排序解析依赖。
2. 容器实现机制
- BeanFactory:基础容器接口,提供
getBean()
方法获取对象实例。 - ApplicationContext:扩展容器,支持事件发布、国际化等高级功能。
- 工作流程:
3. 依赖注入(DI)方式
- 构造器注入:通过构造函数传递依赖
public class UserService {private final UserDao userDao;// 容器自动注入public UserService(UserDao userDao) {this.userDao = userDao;} }
- Setter注入:通过setter方法赋值
public class OrderService {private PaymentService paymentService;// 容器调用setterpublic void setPaymentService(PaymentService ps) {this.paymentService = ps;} }
- 字段注入:通过
@Autowired
直接注入字段(需谨慎使用)
4. 生命周期管理
容器管理的Bean生命周期:
实例化 → 属性填充 → BeanNameAware → BeanFactoryAware →
PreInitialization → @PostConstruct → InitializingBean →
自定义init → PostInitialization → 使用期 → @PreDestroy →
DisposableBean → 自定义destroy
5. 配置元数据
- XML配置:传统方式,显式定义Bean
<bean id="userDao" class="com.dao.UserDaoImpl"/> <bean id="userService" class="com.service.UserService"><constructor-arg ref="userDao"/> </bean>
- 注解驱动:现代主流方式
@Repository // 标识Bean public class UserDaoImpl {}@Service public class UserService {@Autowired // 自动注入private UserDao userDao; }
- Java配置:通过
@Configuration
类@Configuration public class AppConfig {@Beanpublic UserDao userDao() {return new UserDaoImpl();} }
关键优势
- 解耦:对象不关心依赖创建,只需声明接口
- 可测试性:依赖可替换为Mock对象
- 灵活性:通过配置切换实现类(如
DataSource
切换) - 维护性:依赖关系集中管理,避免散落在代码中
典型应用场景:当需要将
MySQLRepository
替换为MongoRepository
时,只需修改配置,无需改动业务代码,体现了IoC的核心价值——将变化隔离在配置层。