SpringIOC 容器对Bean 配置资源的载入是从refresh()函数开始的,refresh()是一个模板方法,规定了IOC 容器的启动流程, 有些逻辑要交给其子类去实现。它对Bean 配置资源进行载入ClassPathXmlApplicationContext 通过调用其父类AbstractApplicationContext 的refresh()函数启
动整个IOC 容器对Bean 定义的载入过程,现在我们来详细看看refresh()中的逻辑处理:

@Override
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.//1、调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识prepareRefresh();// Tell the subclass to refresh the internal bean factory.//2、告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从//子类的refreshBeanFactory()方法启动ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.//3、为BeanFactory配置容器特性,例如类加载器、事件处理器等prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.//4、为容器的某些子类指定特殊的BeanPost事件处理器postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.//5、调用所有注册的BeanFactoryPostProcessor的BeaninvokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.//6、为BeanFactory注册BeanPost事件处理器.//BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件registerBeanPostProcessors(beanFactory);// Initialize message source for this context.//7、初始化信息源,和国际化相关.initMessageSource();// Initialize event multicaster for this context.//8、初始化容器事件传播器.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.//9、调用子类的某些特殊Bean初始化方法onRefresh();// Check for listener beans and register them.//10、为事件传播器注册事件监听器.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.//11、初始化所有剩余的单例BeanfinishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.//12、初始化容器的生命周期事件处理器,并发布容器的生命周期事件finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.//13、销毁已创建的BeandestroyBeans();// Reset 'active' flag.//14、取消refresh操作,重置容器的同步标识。cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...//15、重设公共缓存resetCommonCaches();}}
}

refresh()方法主要为IOC 容器Bean 的生命周期管理提供条件,Spring IOC 容器载入Bean 配置信息从其子类容器的refreshBeanFactory() 方法启动, 所以整个refresh() 中“ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();”这句以后代码的都是注册容器的信息源和生命周期事件,我们前面说的载入就是从这句代码开始启动。

refresh()方法的主要作用是:在创建IOC 容器前,如果已经有容器存在,则需要把已有的容器销毁和关闭,以保证在refresh 之后使用的是新建立起来的IOC 容器。它类似于对IOC 容器的重启,在新建立好的容器中对容器进行初始化,对Bean 配置资源进行载入。

基于Xml 的IOC 容器-开始启动相关推荐

  1. 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  2. 基于Xml 的IOC 容器-分配解析策略

    XmlBeanDefinitionReader 类中的doLoadBeanDefinition()方法是从特定XML 文件中实际载入Bean 配置资源的方法,该方法在载入Bean 配置资源之后将其转换 ...

  3. 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化

    IOC 容器的初始化包括 BeanDefinition 的 Resource 定位.加载和注册这三个基本的过程. 我们以ApplicationContext 为例讲解,ApplicationConte ...

  4. 基于Xml 的IOC 容器-载入<list>的子元素

    在BeanDefinitionParserDelegate 类中的parseListElement()方法就是具体实现解析<property>元素中的<list>集合子元素,源 ...

  5. 基于Xml 的IOC 容器-载入<bean>元素

    Bean 配置信息中的<import>和<alias>元素解析在DefaultBeanDefinitionDocumentReader 中已经完成,对Bean 配置信息中使用最 ...

  6. 基于Xml 的IOC 容器-将配置载入内存

    BeanDefinitionDocumentReader 接口通过registerBeanDefinitions() 方法调用其实现类DefaultBeanDefinitionDocumentRead ...

  7. 基于Xml 的IOC 容器-准备文档对象

    DocumentLoader 将Bean 配置资源转换成Document 对象的源码如下: //使用标准的JAXP将载入的Bean定义资源转换成document对象 @Override public ...

  8. 基于Xml 的IOC 容器-创建容器

    obtainFreshBeanFactory()方法调用子类容器的refreshBeanFactory()方法,启动容器载入Bean 配置信息的过程,代码如下: protected Configura ...

  9. 基于Xml 的IOC 容器-获得配置路径

    通过分析ClassPathXmlApplicationContext 的源代码可以知道, 在创建ClassPathXmlApplicationContext 容器时,构造方法做以下两项重要工作: 首先 ...

最新文章

  1. oracle客户端没有装exp,oracle 10G 客户端安装后,尝试 exp 命令报错, 求解
  2. 复数的物理意义是什么
  3. redis windows
  4. CentOS7和CentOS6怎样开启MySQL远程访问
  5. Apache Sentry架构介绍
  6. 实现一个正则表达式引擎in Python(一)
  7. jupyter 托管_如何在本地托管的Jupyter Notebook上进行协作
  8. Vue-router 的使用 (vue3.x版本)
  9. 解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题
  10. 理解lambda在linq中的应用
  11. Spring @Async配置4. 基于@Async无返回值调用 使用的方式非常简单,一个标注即可解决所有的问题: 1 @Async //标注使用 2 public void asyncMe
  12. vue里面rules_vue如何使用rules对表单字段进行校验
  13. 如何将列表分成大小均匀的块?
  14. 使用jsPlumb插件实现动态连线功能
  15. linux变量接收命令返回值,linux shell自定义函数(定义、返回值、变量作用域)介绍...
  16. markdown来写API接口文档
  17. 高等数学(第七版)同济大学 习题8-1 个人解答
  18. 1.7亿,国家重点研发计划“综合交通运输与智能交通”2019年项目申报开始
  19. SEO引擎首页优化 - 2016百度搜索引擎算法
  20. 修改北京定点医院amp;查询医保信息

热门文章

  1. POJ3398 Perfect Service
  2. 分组,命名分组,url的命名和反向解析
  3. 小白的python进阶历程------01.初识python
  4. linux/windows中mysql、oracle、dm数据库连接
  5. Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
  6. 阿里云的云虚拟主机安装dede提示数据库连接失败的解决办法
  7. wait 和 sleep 的区别
  8. 优秀的人,都敢对自己下狠手
  9. java_codereview随笔
  10. 基于Swoole开发PHP扩展