SpringIOC初始化:refresh()方法深度解析

0 下载量 186 浏览量 更新于2024-09-09 收藏 97KB PDF 举报
"本文将深入探讨Spring IOC容器的refresh()方法,通过实例代码解析其在初始化过程中的核心步骤,包括完成BeanFactory初始化、配置转换服务、处理嵌入式值解析器以及加载时间织入(LoadTimeWeaving)的处理。" 在Spring框架中,`refresh()`方法是用于启动和刷新Spring的IoC(Inversion of Control,控制反转)容器,它执行一系列关键操作以准备容器来管理bean的生命周期和依赖注入。当我们调用`refresh()`方法时,Spring会执行以下主要步骤: 1. **配置加载**:首先,`refresh()`方法会加载配置元数据,这通常来自XML文件、Java配置类或注解。这些元数据定义了bean的定义和它们之间的依赖关系。 2. **BeanDefinition注册**:配置加载后,Spring将bean定义注册到BeanDefinitionRegistry中,每个bean定义包含了bean的类、属性、依赖等信息。 3. **BeanFactory初始化**:接着,Spring创建一个BeanFactory,这是一个工厂对象,用于管理和实例化bean。在`finishBeanFactoryInitialization(beanFactory)`这个阶段,会执行以下操作: - **初始化ConversionService**:如果存在名为`CONVERSION_SERVICE_BEAN_NAME`的bean,并且它是`ConversionService`类型,那么将其设置为BeanFactory的转换服务,用于处理类型转换。 - **添加嵌入式值解析器**:如果容器中没有`PropertyPlaceholderConfigurer`类型的bean,那么将添加一个默认的嵌入式值解析器,以便解析属性占位符,如`${password}`这样的环境变量。 4. **处理LoadTimeWeaverAware beans**:`finishBeanFactoryInitialization()`方法还会查找所有实现了`LoadTimeWeaverAware`接口的bean,并提前实例化它们,以便在类加载时进行织入增强,这对于AOP代理(如Spring的AspectJ自动代理)非常重要。 5. **实例化单例bean**:在`finishBeanFactoryInitialization()`之后,Spring会开始实例化所有的单例bean,但只限于那些不依赖于其他尚未初始化的bean。 6. **初始化bean后处理器**:Spring会查找并初始化所有实现`BeanPostProcessor`接口的bean,这些处理器可以自定义bean的初始化和销毁行为。 7. **初始化剩余的单例bean**:在所有后处理器初始化完成后,Spring将实例化所有剩余的单例bean。这是一个分两步的过程,首先是预初始化,然后是最终初始化。 8. **完成bean初始化**:所有单例bean都被实例化后,Spring会调用它们的初始化方法(如果有的话),这可以通过`@PostConstruct`注解的方法或`init-method`属性指定。 9. **发布初始化事件**:最后,`refresh()`方法会发布一个`ContextRefreshedEvent`事件,通知所有监听器容器已经刷新完成。 通过以上步骤,Spring容器完成了它的初始化,现在它可以响应请求,创建和管理bean的实例,以及处理依赖注入。这个过程对于理解和优化Spring应用的性能至关重要。