Spring容器创建流程——总结
spring容器创建的主要流程在他的refresh()方法中,接下来就开始总结一个下他的refresh()方法中的每个步骤大概都做了那些事情。refresh() 可在AbstractApplicationContext中找到。
prepareRefresh
- 标识容器状为active
- 运行环境(包装为一个Environment类)的设置与验证。
obtainFreshBeanFactory
- 创建(new)BeanFactory,默认创建一个DefaultListableBeanFactory
- 然后进行bean定义信息的加载,封装为beanDefinition保存。
prepareBeanFactory
- 设置类加载器
- 设置Spel解析器
- 设置资源文件的字段解析器
- 设置一个后置处理器ApplicationContextAwareProcessor(完成对XXXAware,例如ApplicationContextAware等类的注入)
- 设置忽略注入接口
prepareBeanFactory(beanFactory)
留给子类的一个扩展方法。
invokeBeanFactoryPostProcessors
- 对BeanDefinitionRegistryPostProcessor(也是一个beanFactory后置处理器,可以重新注册一些bean定义信息)的postProcessBeanDefinitionRegistry()方法根据顺序调用。
- 对普通的BeanFactoryPostProcessor的postProcessBeanFactory()方法根据顺序调用。
registerBeanPostProcessors
- 按照顺序注册 BeanPostProcessor
- 按照顺序注册 MergedBeanDefinitionPostProcessor
initMessageSource
- 初始化消息资源(对国际化支持)如果配置了一个名为messageSource的MessageSource实现,那么使用配置的实现。否则使用一个默认的MessageSource(但它没什么用)
initApplicationEventMulticaster
- 初始化事件派发器(事件派发机制支持)如果配置了一个名为applicationEventMulticaster的ApplicationEventMulticaster实现,那么使用配置的实现。否则使用SimpleApplicationEventMulticaster。
onRefresh
留给子类扩展
registerListeners
- 获取ApplicationListener实现的全类名,进行注册保存。
finishBeanFactoryInitialization
- 获取剩余的beanDefinition准备初始化
- 调用InstantiationAwareBeanPostProcess的postProcessBeforeInstantiation (Class<?> beanClass, String beanName)尝试获取实例
- 选择合适的方式创建实例,默认反射用构造器创建
- 调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)允许修改bean定义信息
- 调用InstantiationAwareBeanPostProcess的postProcessAfterInstantiation(Object bean, String beanName)实例创建后处理
- InstantiationAwareBeanPostProcessor的postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)允许在注入属性之前对属性进行一些修改
- 自动属性注入
- BeanPostProcessor的postProcessBeforeInitialization()方法调用
- 调用bean指定的init方法
- BeanPostProcessor的postProcessAfterInitialization()方法调用
finishRefresh
- 清除资源缓存
- 调用声明周期处理器的start()方法
- 发布ContextRefreshedEvent 容器刷新完成事件
Spring容器创建流程——总结相关推荐
- Spring容器创建流程(1)容器创建准备
本系列文章将逐一介绍,Spring容器创建到容器刷新完成每个过程. Spring容器继承结构图 第一步,new容器实例 ApplicationContext factory = new ClassPa ...
- spring系列-注解驱动原理及源码-spring容器创建流程
目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...
- Spring容器创建流程(2)创建beanFactory,加载BeanDefinition
Spring 容器的创建.obtainFreshBeanFactorr()中完成容器的创建.(BeanFactory关系类图,之前的执行流程可在本系列博客中看到).接下来看容器创建的第二部,创建bea ...
- Spring容器创建流程(9)完成创建
Spring的refresh() 方法中finishRefresh()方法完成之后也就代表着,Spring容器真正的创建完成了.下面看finishRefresh()的源码. 容器refresh总览: ...
- Spring容器创建流程(8)初始化bean
finishBeanFactoryInitialization(beanFactory); 很重要的一步,初始化剩余未初始化的bean(还没有创建实例放到容器中的). 容器refresh总览: syn ...
- Spring容器创建流程(5)bean后置处理之注册
registerBeanPostProcessors 注册bean的后置处理器(以前的执行流程可在系列文章中查看),注意 beanFactoryPostProcessor 是 bean工厂的后置处理器 ...
- Spring容器创建流程(4)调用beanFactory后置处理器
postProcessBeanFactory() 方法留给子类去实现. invokeBeanFactoryPostProcessors() 调用bean工厂的后置处理器(以前的执行流程可在系列文章中查 ...
- Spring容器创建流程(3)对beanFactory设置
容器已经创建完成,接下来 执行prepareBeanFactory(),对BeanFactory做一些设置与准备工作.(之前的执行流程可在本系列博客中看到) 容器refresh 总览: synchro ...
- Spring容器创建流程(7)事件派发机制
Spring事件驱动,监听机制.由三步分组成,事件,派发器,监听器. 事件: spring事件的顶级父类是EventObject,通常情况下继承ApplicationEvent 自定义自己的事件. 事 ...
最新文章
- this的用法(java篇)
- boost::hana::accessors用法的测试程序
- java 设计模式 示例_Java中的访问者设计模式–示例教程
- linux讲日志暂停,linux – Rsyslog在日志轮换后停止向远程服务器发送数据
- 中年发福谁之“过”?Science论文采用“双标水”法首次揭示全生命周期代谢规律...
- python学出来能做什么-python学出来能做什么
- 计算机wind10切换桌面wind7系统,win10多桌面切换的方法以及开启步骤是怎样的
- spss无法连接到本地计算机,通过远程连接打开SPSS产品时,收到许可证错误信息。从本地打开同一产品时没有错误。...
- 手机计算机文件夹加密文件,如何给手机以及电脑文件加密?
- 完美解决Can‘t locate Data/Dumper.pm in @INC
- 决胜B端(一)概述篇-走进B端
- 斯坦福大学iOS应用开发教程学习笔记(第六课)故事版 StoryBoard
- 王自如发致歉声明 称对现有业务进行整改
- STM32配置组合设备(HID+CDC)
- 记一次requestAnimationFrame之后页面崩溃、内存泄漏问题
- module github.com/jinzhu/gorm/dialects/mysql: git ls-remote -q origin in E:\go_gin\pkg\mod\cache\vcs
- 关于“#define REG_MEM_BASE (*(volatile unsigend long *)(PA_BAES + 0x00000050))”语句的解析
- metascape没有输出通路图
- 蓝桥《最大和》python题解
- java 邮箱地址生成器_关于java:生成随机电子邮件