refresh()方法
本文主要对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()方法相关推荐
- [转]bootstrapTable refresh 方法使用简单举例
原文地址:https://blog.csdn.net/lanyang123456/article/details/55805478 本文就bootstrapTable refresh 方法如何传递参数 ...
- 延时加载refresh()方法
先从IOC 容器的初始化过程开始,我们知道IOC 容器读入已经定位的Bean 定义资源是从refresh()方法开始的,我们首先从AbstractApplicationContext 类的refres ...
- Spring的refresh()方法调用过程
Spring的refresh()方法调用过程 refresh()是Spring中比较核心的方法,Spring所有的初始化都在这个方法中完成 具体代码如下 public void refresh() t ...
- bootstrapTable refresh 方法使用简单举例
本文就bootstrapTable refresh 方法如何传递参数做简单举例说明. 下面代码中,一个table,一个button,单击button会触发刷新表格操作. <!DOCTYPE ht ...
- SpringBoot bean解析之refresh方法(一)
bean解析是springboot IOC思想的核心, bean解析的核心则是 AbstractApplicationContext 类中的refresh方法: AbstractApplication ...
- 【四】Spring源码分析之启动主流程---AbstractApplicationContext的refresh方法
入口: 在SpringBoot启动的时候,SpringApplication的run方法中 refreshContext(context); 里面最终调用的是AbstractApplicationCo ...
- refresh方法_Android Shake to Refresh教程
refresh方法 在本文中,我们想探索另一种刷新应用UI的方法,称为Shake to Refresh . 我们都知道在几个应用程序中实现的"从上到下"模式. 在这种模式下,我们沿 ...
- spring4.1.8初始化源码学习三部曲之三:AbstractApplicationContext.refresh方法
本章是<spring4.1.8初始化源码学习三部曲>系列的终篇,重点是学习AbstractApplicationContext类的refresh()方法: 原文地址:https://blo ...
- spring 中 ApplicationContext 的 refresh 方法做了什么
refresh 方法可以说是Spring中核心的一个方法了,通过这个方法可以获取bean的定义.创建添加bean到spring容器中一个其它扩展功能.记录下相关内容. 有个问题:refresh方法为什 ...
- Spring IOC refresh()方法——告诉子类刷新内部bean工厂
告诉子类刷新内部bean工厂. /*** Tell the subclass to refresh the internal bean factory.* @return the fresh Bean ...
最新文章
- 购华为第1书,写书评赢大奖
- Python-decorator装饰器小结
- Windows 平台下 Go 语言的安装和环境变量设置
- spring boot security ajax_Spring 和 SpringBoot 之间到底有啥区别?
- 无法连接到RDP服务器
- MySQL和mq一致性,Mysql与Redis一致性问题
- 理解osi参考模型分层
- 活动丨PGConf.Asia大会11月17-20日线上直播!
- 【华为云技术分享】听说,AI界奔涌的后浪都相聚在这里
- 两间三层小型别墅图片_占地仅120平的现代风别墅,带KTV和健身房,引领时尚新潮流...
- 利用matlab的帮助功能分别查询inv,MATLAB实验报告第一章..doc
- 大连交通大学计算机网络作业,计算机网络题库(大连交通大学)chapter4
- 提高jQuery的性能
- python︱用asyncio、aiohttp实现异步及相关案例
- axure文本框添加水印_Axure教程:限制输入框输入字数
- Android虚拟电脑,如何让你的android模拟器连接上你电脑的网络
- gulp打包报错 “Error: Unhandled ‘error‘ event at new JS_Parse_Error”
- 大白菜u盘启动盘清除系统登录密码详细教程
- 【深坑】记一次MacBook pro 恢复出厂设置抹盘重装系统
- Linux使用C语言实现ls命令
热门文章
- 为了对电脑进行保护,已经阻止此应用 解决办法
- pc模式 华为mate30_很实用!华为Mate?30全系支持PC模式,无线充+投屏更方便!
- linux中deb文件怎么安装,deb是什么文件?deb文件怎么安装?
- linux系统中权限有几种,Linux系统中三种基本权限
- veu中高德怎么定义多个marker?
- 计算机桌面调音量的图标不见了,电脑调节音量的小喇叭不见了?教你3招,轻松解决!...
- java实现pdf的拆分和合并
- 动手学习深度学习keras版——从零开始实现Vnet 2D版
- 网络运营和网络营销有什么区别?
- 让国外买家秒回复的询盘模板示例