Skip to content

Spring IOC 概述

什么是IOC (控制反转)

控制反转(Inversion of Control,简称IOC)是Spring框架的核心原则之一,它表示将对象的创建、配置和生命周期管理的控制权从应用程序代码转移到框架。在传统的程序设计中,程序代码直接控制对象的创建和使用,而在IOC模式下,这种控制权被反转,由Spring容器负责对象的创建和管理。

IOC的核心优势

  1. 松耦合设计:组件之间的依赖关系由容器管理,减少了组件间的直接依赖
  2. 更好的可测试性:由于组件松散耦合,可以更容易地进行单元测试
  3. 更好的模块化:应用程序分解为可重用的、松散耦合的组件
  4. 减少样板代码:不需要手动创建对象和处理依赖关系
  5. 统一的配置模型:提供了集中式的、一致的配置方式

Spring IOC容器的类型

Spring提供了两种类型的IOC容器:

1. BeanFactory

BeanFactory是Spring IOC容器的基本实现,提供了IOC的基本功能。特点包括:

  • 延迟加载:只有在请求Bean时才会实例化
  • 适合资源受限的环境
  • API相对底层
  • 不提供企业级服务(如AOP、国际化等)
java
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
MyBean myBean = (MyBean) factory.getBean("myBean");

2. ApplicationContext

ApplicationContext是BeanFactory的子接口,提供了更多的企业级功能。它是更常用的IOC容器实现,特点包括:

  • 预加载:在启动时实例化所有singleton Bean
  • 提供企业级服务(如AOP、国际化、事件发布等)
  • 支持多种配置方式(XML、注解、Java配置类)
java
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = context.getBean("myBean", MyBean.class);

IOC容器的实现原理

Spring IOC容器的实现涉及以下几个关键步骤:

  1. 配置元数据:定义Bean及其依赖关系
  2. 实例化容器:创建IOC容器实例
  3. 加载配置:容器读取配置元数据
  4. Bean定义注册:将Bean定义注册到容器
  5. Bean实例化:根据需要创建Bean实例
  6. 依赖注入:注入Bean的依赖项
  7. 初始化回调:执行Bean的初始化方法
  8. 使用Bean:应用程序使用Bean
  9. 销毁回调:在容器关闭时执行销毁方法

配置元数据的方式

Spring IOC容器支持多种配置方式:

1. XML配置

xml
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userService" class="com.example.service.UserServiceImpl">
        <property name="userRepository" ref="userRepository"/>
    </bean>
    
    <bean id="userRepository" class="com.example.repository.JdbcUserRepository"/>
</beans>

2. 注解配置

java
@Service
public class UserServiceImpl implements UserService {
    
    private final UserRepository userRepository;
    
    @Autowired
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    // 业务方法
}

@Repository
public class JdbcUserRepository implements UserRepository {
    // 实现方法
}

3. Java配置类

java
@Configuration
public class AppConfig {
    
    @Bean
    public UserRepository userRepository() {
        return new JdbcUserRepository();
    }
    
    @Bean
    public UserService userService() {
        return new UserServiceImpl(userRepository());
    }
}

依赖注入的方式

Spring支持多种依赖注入方式:

1. 构造器注入

通过构造函数注入依赖:

java
public class UserServiceImpl implements UserService {
    
    private final UserRepository userRepository;
    
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

XML配置:

xml
<bean id="userService" class="com.example.service.UserServiceImpl">
    <constructor-arg ref="userRepository"/>
</bean>

2. Setter注入

通过setter方法注入依赖:

java
public class UserServiceImpl implements UserService {
    
    private UserRepository userRepository;
    
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

XML配置:

xml
<bean id="userService" class="com.example.service.UserServiceImpl">
    <property name="userRepository" ref="userRepository"/>
</bean>

3. 字段注入

通过字段直接注入依赖:

java
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserRepository userRepository;
}

总结

Spring的IOC容器是框架的核心,通过控制反转和依赖注入,它实现了松耦合、可测试和可维护的应用程序设计。Spring提供了多种配置方式和依赖注入策略,可以根据不同的需求选择合适的方式。理解IOC的原理和用法是掌握Spring框架的基础。