相信读者对于ApplicationContext方式加载 XML的使用并不陌生。例如:

ApplicationContext ac = newClassPathXmlApplicationContext(“beans.xml”).从这一节开始笔者将会围绕着ApplicationContext的加载XML文件的使用来讲解Spring源码。首先我们以ClassPathXmlApplicationContext类作为切入点。

public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)throws BeansException {super(parent);<strong>setConfigLocations(configLocations)</strong>;if (refresh) {<strong>refresh()</strong>;}}

上面的方法中,首先执行的是setConfigLocations()的方法,这个方法主是支持多个配置文件以数组方式同时传入。

public void setConfigLocations(String... locations) {if (locations != null) {Assert.noNullElements(locations, "Config locations must not be null");this.configLocations = new String[locations.length];for (int i = 0; i < locations.length; i++) {//解析给定路径this.configLocations[i] = resolvePath(locations[i]).trim();}}else {this.configLocations = null;}}

其次,我们来看一下refresh()的方法,这个函数几乎包含了ApplicationContext中提供的全部功能。

public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.<strong>prepareRefresh();</strong>// Tell the subclass to refresh the internal bean factory.//初始化BeanFactory,并进行XML文件读取ConfigurableListableBeanFactory beanFactory = <strong>obtainFreshBeanFactory()</strong>;// Prepare the bean factory for use in this context.//对BeanFactory进行各种功能填充<strong>prepareBeanFactory(beanFactory)</strong>;try {// Allows post-processing of the bean factory in context subclasses.//子类覆盖方法做额外的处理<strong>postProcessBeanFactory(beanFactory)</strong>;// Invoke factory processors registered as beans in the context.//激活各种BeanFactory处理器<strong>invokeBeanFactoryPostProcessors(beanFactory)</strong>;// Register bean processors that intercept bean creation.//注册拦截Bean创建的Bean处理器,这里只是注册,真正的调用是在getBean时候<strong>registerBeanPostProcessors(beanFactory)</strong>;// Initialize message source for this context.//为上下文初始化Message源,即不同语言的消息体,国际化处理<strong>initMessageSource()</strong>;// Initialize event multicaster for this context.//初始化应用消息广播器,并放入“applicationEventMulticaster”bean中<strong>initApplicationEventMulticaster()</strong>;// Initialize other special beans in specific context subclasses.//留给子类来初始化其它的Bean<strong>onRefresh()</strong>;// Check for listener beans and register them.//在所有注册bean中查找Listener bean,注册到消息广播器中<strong>registerListeners()</strong>;// Instantiate all remaining (non-lazy-init) singletons.//初始化剩下的单例实例(非惰性的)<strong>finishBeanFactoryInitialization(beanFactory)</strong>;// Last step: publish corresponding event.//完成刷新过程,通过生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人<strong>finishRefresh()</strong>;}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.<strong>destroyBeans()</strong>;// Reset 'active' flag.<strong>cancelRefresh(ex)</strong>;// 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...resetCommonCaches();}}}

这里笔者对上面的方法进行以下的概括:

1)        初始化前的准备工作,例如对系统属性或者环境进行准备及验证。

2)        初始化BeanFactory,并进行XML文件读取。

3)        对BeanFactory进行各种功能填充。

4)        子类覆盖方法做额外的处理。

5)        激活各种BeanFactory处理器。

6)        注册拦截bean创建的bean处理器,这里只是注册,真正的调用是在getBean时候。

7)        为上下文初始化Message源,即对不同语言的消息体进行国际化处理。

8)        初始化应用消息广播器,并放入“applicationEventMulticaster”bean中。

9)        留给子类来初始化其他的bean。

10)    在所有注册的bean中查找listenerbean,注册到消息广播器中。

11)    初始化剩下的单例(非惰性)

12)    完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人。

Spring源码之ApplicationContext(一)相关推荐

  1. 第五篇:Spring源码篇-ApplicationContext

    Spring源码篇-ApplicationContext   前面通过手写IoC,DI.AOP和Bean的配置.到最后ApplicationContext的门面处理,对于Spring相关的核心概念应该 ...

  2. Spring源码之ApplicationContext

    ​ 本文是针对Srping的ClassPathXMLApplicationContext来进行源码解析,在本篇博客中将不会讲述spring Xml解析注册代码,因为ApplicationContext ...

  3. Spring源码解析-applicationContext.xml加载和bean的注册

    applicationContext文件加载和bean注册流程 ​ Spring对于从事Java开发的boy来说,再熟悉不过了,对于我们这个牛逼的框架的介绍就不在这里复述了,Spring这个大杂烩,怎 ...

  4. 【06】Spring源码-分析篇-ApplicationContext

    Spring源码篇-ApplicationContext   前面通过手写IoC,DI.AOP和Bean的配置.到最后ApplicationContext的门面处理,对于Spring相关的核心概念应该 ...

  5. Spring源码-applicationcontext.xml解析过程

    为什么80%的码农都做不了架构师?>>>    Spring源码-applicationcontext.xml解析过程 核心流程:Spring中对于applicationcontex ...

  6. java基础巩固-宇宙第一AiYWM:为了维持生计,Spring全家桶_Part1-5(学学Spring源码呗:BeanFactory与ApplicationContext的暗潮涌动与争风吃醋)~整起

    上一集说到,天色渐暗- BeanFactory接口说:一大堆XxxFactory,都跟我有关,我好累呀[BeanFacotry作为Spring中容器功能的基础,用于存放所有已经加载的bean]. Xm ...

  7. 《Spring源码深度解析 郝佳 第2版》ApplicationContext

    往期博客: <Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 <Spring源码深度解析 郝佳 第2版>XML标签的解析 <Spring源码深度 ...

  8. Spring源码——容器扩展ApplicationContext

    前言 内容主要参考自<Spring源码深度解析>一书,算是读书笔记或是原书的补充.进入正文后可能会引来各种不适,毕竟阅读源码是件极其痛苦的事情. 本文主要涉及书中第六章的部分,依照书中内容 ...

  9. 想读Spring源码?先从这篇「 极简教程」开始

    来自:Java中文社群 为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山? 这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考.(PS:也欢 ...

  10. 『互联网架构』软件架构-spring源码之spring结构概述

    spring从07年接触到目前2018年也差不多10年了,一个java的框架为什么能火这么多年.很多人对spring的使用轻车熟路,但是从未解读过spring的源码,老铁跟我一起看看源码,了解下内部的 ...

最新文章

  1. 美国燃油管道商认怂,俄罗斯黑客收到500万美元赎金!,民众为抢汽油大打出手...
  2. OpenCV cv :: UMat与DirectX10曲面的互操作性的实例(附完整代码)
  3. 排位重要还是媳妇儿重要?
  4. python高效处理文件_使用Python语言高效地处理一个文本文件
  5. 中科院一博士论文走红:把书念下去,然后走出去,不枉活一世
  6. HIT Software Construction Review Notes(3-1 Data Type and Type Checking)
  7. php跳转post,php如何使用post跳转页面
  8. springboot 打印slf4_SpringBoot打印请求体与响应体
  9. PMP更新教材了,怎么备考?
  10. 收藏夹+阿里云图标:再也不用担心visio找不到好用的图标了!
  11. 什么是免备案虚拟主机?阿里云国际版云服务器给你答案
  12. matlab自己还原魔方,复原魔方,原来这么简单(内附详细图文解说)
  13. 理解什么叫“自然拼读”
  14. 互联网公司和外包公司有什么区别?为什么有些程序员不想进外包公司?
  15. NASA 选择 Qt 框架开发国际空间站应用
  16. 【GStreamer】gstreamer sink中对比度contrast、亮度brightness、饱和度saturation、hue 概念理解
  17. ERP与CRM、MRP、PLM、APS、MES、WMS、SRM的关系
  18. 北京联通天邑TEWA-800E光猫改桥接
  19. 【搜索引擎基础】spider
  20. S7-200 SMART V2.7安装包下载链接及安装教程

热门文章

  1. 百度在线编辑器 代码高亮
  2. IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证
  3. Python取出SQL表单中的字段名
  4. avascript 运动中Offset的bug解决方案
  5. priority_queue 优先队列 hdu裸题。
  6. How to integrate iAD in your iOS App ?
  7. 基于Cocos2d-x开发guardCarrot--6 《保卫萝卜2》解锁天天向上玩法
  8. 游戏筑基开发之测试篇(C语言)
  9. NIUDAY 七牛美图 AI 共享日 | 大咖云集 邀您共同探索各场景下的 AI 应用与落地...
  10. [Erlang 0127] Term sharing in Erlang/OTP 上篇