Spring IoC(Inversion of Control)是 Spring 框架的核心特性之一,用于实现控制反转和依赖注入(DI, Dependency Injection) 。它的主要目的是解耦对象之间的依赖关系,使应用程序更易于维护和测试。
1. 核心概念
- 控制反转(IoC) : 传统编程中,对象直接创建和管理其依赖的其他对象。而 IoC 将对象的创建和依赖管理交给 Spring 容器,由容器负责对象的生命周期和依赖注入。
- 依赖注入(DI) : 实现 IoC 的具体方式,通过构造函数、Setter 方法或接口注入,将依赖的对象传递给目标对象,而非目标对象自己创建依赖。
2. Spring IoC 容器
Spring 提供两种容器:
- Bean 工厂(BeanFactory) :基础容器,提供基本的依赖注入功能。
- 应用上下文(ApplicationContext) :高级容器,支持更多功能(如事务管理、AOP 等)。
3. 依赖注入方式
a. 构造函数注入
public class UserService {
private UserRepository userRepository;
// 通过构造函数注入依赖
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
b. Setter 注入
public class UserService {
private UserRepository userRepository;
// 通过 Setter 方法注入依赖
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
c. 接口注入(较少使用)
通过实现特定接口定义注入方法。
4. 配置方式
a. XML 配置
<bean id="userRepository" class="com.example.UserRepositoryImpl"/>
<bean id="userService" class="com.example.UserService">
<constructor-arg ref="userRepository"/>
</bean>
b. 注解配置
@Component
public class UserRepositoryImpl implements UserRepository {
// 实现代码
}
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
c. Java 配置类
@Configuration
public class AppConfig {
@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
@Bean
public UserService userService() {
return new UserService(userRepository());
}
}
5. 优势
- 解耦:对象不直接依赖具体实现,而是依赖抽象(如接口)。
- 可测试性:通过注入模拟对象(Mock),轻松进行单元测试。
- 可维护性:依赖关系集中管理,修改时无需改动大量代码。
- 复用性:组件可独立开发和复用。
6. 实际应用场景
- 数据库操作:注入
DataSource、JdbcTemplate等。 - 服务层:注入 DAO 层或其他服务类。
- Web 层:注入 Controller 所需的 Service。
总结
Spring IoC 通过依赖注入和容器管理,显著降低了对象间的耦合度,提升了代码的可维护性和可测试性。它是构建灵活、可扩展的 Spring 应用的基础。