spring容器创建的主要流程在他的refresh()方法中,接下来就开始总结一个下他的refresh()方法中的每个步骤大概都做了那些事情。refresh() 可在AbstractApplicationContext中找到。

prepareRefresh

  1. 标识容器状为active
  2. 运行环境(包装为一个Environment类)的设置与验证。

obtainFreshBeanFactory

  1. 创建(new)BeanFactory,默认创建一个DefaultListableBeanFactory
  2. 然后进行bean定义信息的加载,封装为beanDefinition保存。

prepareBeanFactory

  1. 设置类加载器
  2. 设置Spel解析器
  3. 设置资源文件的字段解析器
  4. 设置一个后置处理器ApplicationContextAwareProcessor(完成对XXXAware,例如ApplicationContextAware等类的注入)
  5. 设置忽略注入接口

prepareBeanFactory(beanFactory)

留给子类的一个扩展方法。

invokeBeanFactoryPostProcessors

  1. 对BeanDefinitionRegistryPostProcessor(也是一个beanFactory后置处理器,可以重新注册一些bean定义信息)的postProcessBeanDefinitionRegistry()方法根据顺序调用。
  2. 对普通的BeanFactoryPostProcessor的postProcessBeanFactory()方法根据顺序调用。

registerBeanPostProcessors

  1. 按照顺序注册 BeanPostProcessor
  2. 按照顺序注册 MergedBeanDefinitionPostProcessor

initMessageSource

  1. 初始化消息资源(对国际化支持)如果配置了一个名为messageSource的MessageSource实现,那么使用配置的实现。否则使用一个默认的MessageSource(但它没什么用)

initApplicationEventMulticaster

  1. 初始化事件派发器(事件派发机制支持)如果配置了一个名为applicationEventMulticaster的ApplicationEventMulticaster实现,那么使用配置的实现。否则使用SimpleApplicationEventMulticaster。

onRefresh

留给子类扩展

registerListeners

  1. 获取ApplicationListener实现的全类名,进行注册保存。

finishBeanFactoryInitialization

  1. 获取剩余的beanDefinition准备初始化
  2. 调用InstantiationAwareBeanPostProcess的postProcessBeforeInstantiation (Class<?> beanClass, String beanName)尝试获取实例
  3. 选择合适的方式创建实例,默认反射用构造器创建
  4. 调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)允许修改bean定义信息
  5. 调用InstantiationAwareBeanPostProcess的postProcessAfterInstantiation(Object bean, String beanName)实例创建后处理
  6. InstantiationAwareBeanPostProcessor的postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)允许在注入属性之前对属性进行一些修改
  7. 自动属性注入
  8. BeanPostProcessor的postProcessBeforeInitialization()方法调用
  9. 调用bean指定的init方法
  10. BeanPostProcessor的postProcessAfterInitialization()方法调用

finishRefresh

  1. 清除资源缓存
  2. 调用声明周期处理器的start()方法
  3. 发布ContextRefreshedEvent 容器刷新完成事件

Spring容器创建流程——总结相关推荐

  1. Spring容器创建流程(1)容器创建准备

    本系列文章将逐一介绍,Spring容器创建到容器刷新完成每个过程. Spring容器继承结构图 第一步,new容器实例 ApplicationContext factory = new ClassPa ...

  2. spring系列-注解驱动原理及源码-spring容器创建流程

    目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...

  3. Spring容器创建流程(2)创建beanFactory,加载BeanDefinition

    Spring 容器的创建.obtainFreshBeanFactorr()中完成容器的创建.(BeanFactory关系类图,之前的执行流程可在本系列博客中看到).接下来看容器创建的第二部,创建bea ...

  4. Spring容器创建流程(9)完成创建

    Spring的refresh() 方法中finishRefresh()方法完成之后也就代表着,Spring容器真正的创建完成了.下面看finishRefresh()的源码. 容器refresh总览: ...

  5. Spring容器创建流程(8)初始化bean

    finishBeanFactoryInitialization(beanFactory); 很重要的一步,初始化剩余未初始化的bean(还没有创建实例放到容器中的). 容器refresh总览: syn ...

  6. Spring容器创建流程(5)bean后置处理之注册

    registerBeanPostProcessors 注册bean的后置处理器(以前的执行流程可在系列文章中查看),注意 beanFactoryPostProcessor 是 bean工厂的后置处理器 ...

  7. Spring容器创建流程(4)调用beanFactory后置处理器

    postProcessBeanFactory() 方法留给子类去实现. invokeBeanFactoryPostProcessors() 调用bean工厂的后置处理器(以前的执行流程可在系列文章中查 ...

  8. Spring容器创建流程(3)对beanFactory设置

    容器已经创建完成,接下来 执行prepareBeanFactory(),对BeanFactory做一些设置与准备工作.(之前的执行流程可在本系列博客中看到) 容器refresh 总览: synchro ...

  9. Spring容器创建流程(7)事件派发机制

    Spring事件驱动,监听机制.由三步分组成,事件,派发器,监听器. 事件: spring事件的顶级父类是EventObject,通常情况下继承ApplicationEvent 自定义自己的事件. 事 ...

最新文章

  1. this的用法(java篇)
  2. boost::hana::accessors用法的测试程序
  3. java 设计模式 示例_Java中的访问者设计模式–示例教程
  4. linux讲日志暂停,linux – Rsyslog在日志轮换后停止向远程服务器发送数据
  5. 中年发福谁之“过”?Science论文采用“双标水”法首次揭示全生命周期代谢规律...
  6. python学出来能做什么-python学出来能做什么
  7. 计算机wind10切换桌面wind7系统,win10多桌面切换的方法以及开启步骤是怎样的
  8. spss无法连接到本地计算机,通过远程连接打开SPSS产品时,收到许可证错误信息。从本地打开同一产品时没有错误。...
  9. 手机计算机文件夹加密文件,如何给手机以及电脑文件加密?
  10. 完美解决Can‘t locate Data/Dumper.pm in @INC
  11. 决胜B端(一)概述篇-走进B端
  12. 斯坦福大学iOS应用开发教程学习笔记(第六课)故事版 StoryBoard
  13. 王自如发致歉声明 称对现有业务进行整改
  14. STM32配置组合设备(HID+CDC)
  15. 记一次requestAnimationFrame之后页面崩溃、内存泄漏问题
  16. module github.com/jinzhu/gorm/dialects/mysql: git ls-remote -q origin in E:\go_gin\pkg\mod\cache\vcs
  17. 关于“#define REG_MEM_BASE (*(volatile unsigend long *)(PA_BAES + 0x00000050))”语句的解析
  18. metascape没有输出通路图
  19. 蓝桥《最大和》python题解
  20. java 邮箱地址生成器_关于java:生成随机电子邮件

热门文章

  1. 大佬分享:程序员必知的干货
  2. 【工业4.0】什么是工业4.0,这篇文章讲得明明白白!
  3. MATLAB2016添加工具箱toolbox方法,有截图
  4. yii2 关掉php notice,php – 使用Yii2中的自动填充更新隐藏字段
  5. apache是怎么运行php的_PHP与WEB服务器是如何交互的
  6. 光标是停在文本框文字的最后
  7. SCRIPT鼠标放在图片上才显示色彩 平时是灰色的图片
  8. 百度Apollo赋能的威马W6,自主泊车体验如何?
  9. 他的产品成华强北山寨模板,仅次华为苹果,这个赛道杀入年轻黑马!
  10. 一年超20万人次在抖音志愿登记器官捐献