目录
Spring IoC(控制反转)的实现机制是 Spring 框架的核心,它通过容器管理对象的生命周期和依赖关系,实现了组件间的解耦。以下是其关键实现机制的深度解析:
一、核心组件与流程
1. BeanDefinition(Bean 定义)
- 角色:存储 Bean 的元数据(如
类名、作用域、依赖关系),是容器创建 Bean 的蓝图。 - 实现方式:
- XML 配置:通过
<bean>
标签定义。<bean id="userService" class="com.example.service.UserServiceImpl"> <!-- 注入依赖 --> <property name="userDao" ref="userDao"/> <!-- 构造器参数注入 --> <constructor-arg ref="dataSource"/> <!-- 初始化和销毁方法 --> <bean id="connectionPool" class="com.example.ConnectionPool" init-method="init" destroy-method="close"/> </bean>
- 注解:通过
@Component
、@Service
等注解声明。 - Java Config:通过
@Configuration
和@Bean
方法定义。
- XML 配置:通过
2. BeanFactory(基础容器)
- 角色:最基础的 IoC 容器接口,负责实例化、配置和管理 Bean。
- 核心实现:
DefaultListableBeanFactory
:默认实现,支持 XML 和注解配置。- 延迟加载:默认情况下,Bean 在首次被请求时创建(而非容器启动时)。
3. ApplicationContext(高级容器)
- 角色:继承
BeanFactory
,扩展企业级功能(如事件发布、国际化、资源加载)。 - 常见实现:
ClassPathXmlApplicationContext
:从类路径加载 XML 配置。AnnotationConfigApplicationContext
:基于 Java 注解配置。- 预加载:容器启动时立即创建所有单例 Bean。
二、依赖注入的实现
1. 注入方式
- 构造器注入:
public class UserServiceImpl implements UserService { private final UserDao userDao; public UserServiceImpl(UserDao userDao) { // 构造器注入 this.userDao = userDao; } }
- Setter 注入:
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { // Setter注入 this.userDao = userDao; } }
- 字段注入(通过反射):
@Service public class UserServiceImpl implements UserService { @Autowired // 字段注入 private UserDao userDao; }
2. 依赖解析策略
- 按类型匹配:默认策略,根据依赖的类型查找 Bean。
- 按名称匹配:通过
@Qualifier
注解指定 Bean 名称。 - 自动装配:通过
@Autowired
或 XML 的autowire
属性实现自动依赖注入。
三、Bean 生命周期管理
1. Bean 创建流程
- 实例化:通过反射或 CGLIB 创建 Bean 实例。
- 属性注入:填充依赖(如通过
@Autowired
)。 - Aware 接口回调:如果实现了
BeanNameAware
等接口,调用相应方法。 - BeanPostProcessor 前置处理:执行自定义初始化前增强。
- 初始化方法:调用
@PostConstruct
注解方法或InitializingBean
接口的afterPropertiesSet()
。 - BeanPostProcessor 后置处理:执行自定义初始化后增强(如 AOP 代理)。
- 使用 Bean:容器管理的 Bean 可被应用使用。
- 销毁方法:容器关闭时,调用
@PreDestroy
注解方法或DisposableBean
接口的destroy()
。
2. 关键接口
- InstantiationAwareBeanPostProcessor:干预 Bean 实例化过程。
- BeanPostProcessor:在初始化前后增强 Bean(如 AOP 代理的创建)。
- InitializingBean/DisposableBean:定义初始化和销毁逻辑。
四、高级特性
1. 作用域(Scope)
- 单例(Singleton):容器中仅存在一个实例(默认)。
- 原型(Prototype):每次请求创建新实例。
- Web 作用域:
request
、session
、application
(仅 Web 环境可用)。
2. 自动扫描与组件注册
- 组件扫描:通过
@ComponentScan
注解自动发现带@Component
等注解的类。 - 条件注册:通过
@Conditional
注解根据条件决定是否注册 Bean。
3. 注解驱动
- 核心注解:
@Component
/@Service
/@Repository
/@Controller
:定义组件。@Autowired
/@Inject
/@Resource
:依赖注入。@Qualifier
:指定候选 Bean。@Primary
:标记首选 Bean。
五、源码级实现要点
1. BeanDefinitionReader
- 解析配置源(XML / 注解 / Java Config),生成
BeanDefinition
。
2. BeanWrapper
- 封装 Bean 实例,提供设置属性值和类型转换的能力。
3. 类型转换
- 通过
ConversionService
实现 String 到其他类型的自动转换。
4. 循环依赖处理
- 三级缓存机制:
singletonObjects
:存储完全初始化的单例 Bean。singletonFactories
:存储创建 Bean 的工厂。earlySingletonObjects
:存储提前暴露的半成品 Bean(用于解决循环依赖)。
六、总结
Spring IoC 通过BeanDefinition存储元数据,BeanFactory创建和管理 Bean,依赖注入实现组件解耦,并通过生命周期回调和后置处理器提供扩展点。其核心优势在于:
- 解耦能力:组件仅依赖接口,无需关心具体实现。
- 可测试性:方便替换依赖(如注入 Mock 对象)。
- 灵活性:通过配置而非硬编码,支持动态切换实现。
理解这些机制有助于更深入地使用 Spring 框架,解决实际开发中的依赖管理、循环依赖、自定义初始化等问题。