本文主要对refresh()方法作概览性的记录

refresh方法一共包含12步,概览如下:

(1)prepareRefresh()

  • 本质没做啥,创建并设置了Environment对象

(2)obtainFreshBeanFactory()

  • 新建或重建工厂:实例化 DefaultListableBeanFactory
  • 设置 循环依赖 和 允许覆盖 两个参数
  • 执行 loadBeanDefinitions(beanFactory)方法,这一步执行完后,配置文件中的bean都被解析完成,所有beanDefinition都被注册到了beanFactory.beanDefinitionMap中
    • 值得注意的是,对于spring(非springboot)而言,这里注册了几个重要的类到beanDefinitionMap中
    • ConfigurationClassPostProcessor:非常非常重要,本质是一个BeanDefinitionRegistryPostProcessor
    • RequiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,AutowiredAnnotationBeanPostProcessor:本质是BeanPostProcessor

(3)prepareBeanFactory(beanFactory)

//AbstractApplicationContext.java
public void refresh() throws BeansException, IllegalStateException {synchronized(this.startupShutdownMonitor) {//1.调用本类方法://    (1)设置容器的启动时间//    (2)设置活跃状态为true//    (3)设置关闭状态为false//    (4)获取Environment对象,并加载当前系统的属性值到Environment对象中//    (5)准备监听器和事件的集合对象,默认为空的集合this.prepareRefresh();//2.调用子类AbstractRefreshableApplicationContext.class的refreshBeanFactory()方法//    (1)如果工厂已经存在则销毁;//    (2)创建新的beanFactory:DefaultListableBeanFactory;//    (3)定制beanFactory,设置相关属性,设置是否允许覆盖和循环依赖;//    (4)调用子类AbstractRefreshableApplicationContext.class的loadBeanDefinitions(beanFactory)方法对bean进行注册;//        (4.1)实例化XmlBeanDefinitionReader并配置它的应用环境Environment,ResourceLoader,EntityResolver等初始化内容//        (4.2)调用loadBeanDefinitions(beanDefinitionReader)重要方法,构建DOM树,把beanDefinitions都注册到beanDefinationMap中去ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();//3.调用本类方法:填充beanFactory的属性//  初始化beanFactory中的一些基本参数//      (3.1)设置 BeanFactory 的classLoader为当前 context 的classLoader//      (3.2)设置 BeanFactory 的 BeanExpressionResolver(表达式语言处理器)//      (3.3)为BeanFactory增加一个默认的 propertyEditor,这个主要是对bean的属性等设置管理的一个工具类//      (3.4)添加一个 BeanPostProcessor:ApplicationContextAwareProcessor,此类用来完成某些Aware对象的注入//      (3.5)设置要一些忽略自动装配的接口//      (3.6)设置几个自动装配的特殊规则//      (3.7)添加一个 BeanPostProcessor:ApplicationListenerDetector//      (3.8)手动注册几个特殊的 系统环境bean 到一级缓存中this.prepareBeanFactory(beanFactory);try {//4.AbstractApplicationContext中该方法是个空方法,留给子类进行扩展//子类可以实现BeanPostProcess接口,spring里会进行回调//在所有beanDefinition加载完成之后,bean实例化之前执行//一般是为了修改bean definitions或者对BeanFactory做其他配置this.postProcessBeanFactory(beanFactory);//5. 这个方法中会去调用实现了BeanFactoryPostProcessor接口实现类的postProcessBeanFactory方法this.invokeBeanFactoryPostProcessors(beanFactory);//6.实例化并注册所有BeanPostProcessor beansthis.registerBeanPostProcessors(beanFactory);//7.国际化this.initMessageSource();//8.初始化事件广播器。如果自定义了广播器,用自定义的this.initApplicationEventMulticaster();//9.空方法,留给子类来初始化其他beanthis.onRefresh();//10.在所有注册的bean中查找listener bean,注册到消息广播器中this.registerListeners();//11.非常重要,实例化所有剩余的(非懒加载)单例Bean。(也就是我们自己定义的那些Bean们)//比如invokeBeanFactoryPostProcessors方法中根据各种注解解析出来的类,在这个时候都会被初始化  扫描的 @Bean之类的//实例化的过程各种BeanPostProcessor开始起作用~~~~~~~~~~~~~~this.finishBeanFactoryInitialization(beanFactory);//12.//refresh做完之后需要做的其他事情//清除上下文资源缓存(如扫描中的ASM元数据)//初始化上下文的生命周期处理器,并刷新(找出Spring容器中实现了Lifecycle接口的bean并执行start()方法)。//发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作this.finishRefresh();} catch (BeansException var9) {if (this.logger.isWarnEnabled()) {this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);}this.destroyBeans();this.cancelRefresh(var9);throw var9;} finally {this.resetCommonCaches();}}}

refresh()方法相关推荐

  1. [转]bootstrapTable refresh 方法使用简单举例

    原文地址:https://blog.csdn.net/lanyang123456/article/details/55805478 本文就bootstrapTable refresh 方法如何传递参数 ...

  2. 延时加载refresh()方法

    先从IOC 容器的初始化过程开始,我们知道IOC 容器读入已经定位的Bean 定义资源是从refresh()方法开始的,我们首先从AbstractApplicationContext 类的refres ...

  3. Spring的refresh()方法调用过程

    Spring的refresh()方法调用过程 refresh()是Spring中比较核心的方法,Spring所有的初始化都在这个方法中完成 具体代码如下 public void refresh() t ...

  4. bootstrapTable refresh 方法使用简单举例

    本文就bootstrapTable refresh 方法如何传递参数做简单举例说明. 下面代码中,一个table,一个button,单击button会触发刷新表格操作. <!DOCTYPE ht ...

  5. SpringBoot bean解析之refresh方法(一)

    bean解析是springboot IOC思想的核心, bean解析的核心则是 AbstractApplicationContext 类中的refresh方法: AbstractApplication ...

  6. 【四】Spring源码分析之启动主流程---AbstractApplicationContext的refresh方法

    入口: 在SpringBoot启动的时候,SpringApplication的run方法中 refreshContext(context); 里面最终调用的是AbstractApplicationCo ...

  7. refresh方法_Android Shake to Refresh教程

    refresh方法 在本文中,我们想探索另一种刷新应用UI的方法,称为Shake to Refresh . 我们都知道在几个应用程序中实现的"从上到下"模式. 在这种模式下,我们沿 ...

  8. spring4.1.8初始化源码学习三部曲之三:AbstractApplicationContext.refresh方法

    本章是<spring4.1.8初始化源码学习三部曲>系列的终篇,重点是学习AbstractApplicationContext类的refresh()方法: 原文地址:https://blo ...

  9. spring 中 ApplicationContext 的 refresh 方法做了什么

    refresh 方法可以说是Spring中核心的一个方法了,通过这个方法可以获取bean的定义.创建添加bean到spring容器中一个其它扩展功能.记录下相关内容. 有个问题:refresh方法为什 ...

  10. Spring IOC refresh()方法——告诉子类刷新内部bean工厂

    告诉子类刷新内部bean工厂. /*** Tell the subclass to refresh the internal bean factory.* @return the fresh Bean ...

最新文章

  1. 购华为第1书,写书评赢大奖
  2. Python-decorator装饰器小结
  3. Windows 平台下 Go 语言的安装和环境变量设置
  4. spring boot security ajax_Spring 和 SpringBoot 之间到底有啥区别?
  5. 无法连接到RDP服务器
  6. MySQL和mq一致性,Mysql与Redis一致性问题
  7. 理解osi参考模型分层
  8. 活动丨PGConf.Asia大会11月17-20日线上直播!
  9. 【华为云技术分享】听说,AI界奔涌的后浪都相聚在这里
  10. 两间三层小型别墅图片_占地仅120平的现代风别墅,带KTV和健身房,引领时尚新潮流...
  11. 利用matlab的帮助功能分别查询inv,MATLAB实验报告第一章..doc
  12. 大连交通大学计算机网络作业,计算机网络题库(大连交通大学)chapter4
  13. 提高jQuery的性能
  14. python︱用asyncio、aiohttp实现异步及相关案例
  15. axure文本框添加水印_Axure教程:限制输入框输入字数
  16. Android虚拟电脑,如何让你的android模拟器连接上你电脑的网络
  17. gulp打包报错 “Error: Unhandled ‘error‘ event at new JS_Parse_Error”
  18. 大白菜u盘启动盘清除系统登录密码详细教程
  19. 【深坑】记一次MacBook pro 恢复出厂设置抹盘重装系统
  20. Linux使用C语言实现ls命令

热门文章

  1. 为了对电脑进行保护,已经阻止此应用 解决办法
  2. pc模式 华为mate30_很实用!华为Mate?30全系支持PC模式,无线充+投屏更方便!
  3. linux中deb文件怎么安装,deb是什么文件?deb文件怎么安装?
  4. linux系统中权限有几种,Linux系统中三种基本权限
  5. veu中高德怎么定义多个marker?
  6. 计算机桌面调音量的图标不见了,电脑调节音量的小喇叭不见了?教你3招,轻松解决!...
  7. java实现pdf的拆分和合并
  8. 动手学习深度学习keras版——从零开始实现Vnet 2D版
  9. 网络运营和网络营销有什么区别?
  10. 让国外买家秒回复的询盘模板示例