SpringIOC初始化:refresh()方法深度解析
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应用的性能至关重要。
251 浏览量
149 浏览量
234 浏览量
374 浏览量
1661 浏览量
834 浏览量
4297 浏览量
149 浏览量
234 浏览量
weixin_38664612
- 粉丝: 6
- 资源: 888
最新资源
- 51单片机汇编程序-LED点阵实现简易俄罗斯方块游戏
- wormhole-0.7.0.tar.gz
- random-starred-repository:返回由用户加注星标的随机存储库
- File_Hunter:使用文件玩俄罗斯轮盘! :))
- CSS3灯光闪烁动画文字特效特效代码
- MyBlog:这是一个基于SSM的博客系统
- Sweet Puzzle Time-crx插件
- crbclientregisterand:CRB 客户端注册和。 是一个 android 客户端,它从 android 捕获客户端详细信息并通过restful web 服务将其持久化到 CRB 客户端注册播放框架应用程序
- gRPC中Java和node进行异构通信-互为客户端和服务端示例代码.rar
- Briefwechsel.github.io
- react_spotify:React我们Spotify Stats应用程序的一面
- semantic_logger:Semantic Logger是功能丰富的日志记录框架,可替代现有的Ruby&Rails记录器
- lablabtop
- rest-api-springboot
- 测试工程师学习路线.zip
- MozStumbler:适用于Mozilla的Android Stumbler