Spring IoC(Inversion of Control)

52 阅读2分钟

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. 实际应用场景

  • 数据库操作:注入 DataSourceJdbcTemplate 等。
  • 服务层:注入 DAO 层或其他服务类。
  • Web 层:注入 Controller 所需的 Service。

总结

Spring IoC 通过依赖注入和容器管理,显著降低了对象间的耦合度,提升了代码的可维护性和可测试性。它是构建灵活、可扩展的 Spring 应用的基础。