接着上一篇顺藤摸瓜,Spring版本3.2.16,代码调试工具Eclipse,没有可直接导入Eclipse源码的同志可在下方留言,寡人免费赠送一份。接下来以ApplicationContext容器系列为例,通过分析ApplicationContext的实现来分析资源定位的相关源码。
ApplicationContext是一个接口,它的主要实现有两个,FileSystemXmlApplicationContext和ClassPathXmlApplicationContext。

不同的实现对应不同的加载方式。FileSystemXmlApplicationContext从文件系统加载配置文件,ClassPathXmlApplicationContext从类路径下加载资源文件,能让人”望文生义“哇。接下来我们就以常用的ClassPathXmlApplicationContext为例,进行深入的分析。
进入ClassPathXmlApplicationContext类中,我们会发现这个类有很多个构造函数,根据我们一般的用法
ApplicationContext ap = new ClassPathXmlApplicationContext(“xxxxx.xml”);在实例化ClassPathXmlApplicationContext的时候调用的是其参数为String类型的构造函数,而这个函数会调用初始化IOC容器的一个函数。

其中,这个refresh方法非常重要,它是IOC容器初始化的一个入口。我们可以把这个refresh方法理解成启动IOC容器的方法。这个方法的具体实现在ClassPathXmlApplicationContext的父类AbstractApplicationContext中,关于ClassPathXmlApplicationContext的继承体系,第一张图中展示的很清晰。
进入refresh方法,可以发现这个方法做了很多事情,但我们关心的是Xml的读取。

顺着obtainFreshBeanFactory方法,进入到AbstractRefreshableApplicationContext的refreshBeanFactory方法,这个方法的主要功能就是创建默认的IOC容器和Xml配置文件的相关操作。

BeanFactory是Spring的基础容器,它的主要继承体系如图:

其中DefaultListableBeanFactory类是BeanFactory的默认实现,其它一些容器的实现都是在这个类的基础上进行功能扩展。
进入loadBeanDefinitions方法,方法里定义了一个XmlBeanDefinitionReader类型的对象,这个对象的作用就是读取Xml配置文件。

进入loadBeanDefinitions方法,我们会看到有两种方式加载配置文件,一种是从Resource类型的路径中加载,还有一种是从String类型的路径中加载。

顺着这条路一直往下走,进入AbstractBeanDefinitionReader的loadBeanDefinitions方法

这个方法主要做了三件事,分别是获取资源读取器,定位具体的配置文件路径和加载配置文件。本篇文章的重点找到了,那就是定位具体的配置文件路径,如何定位的呢?进入DefaultResourceLoader的getResource方法。为什么进入的是DefaultResourceLoader类呢?进入获取资源读取器的方法中,我们来到了AbstractBeanDefinitionReader类,getResourceLoader方法就返回了一个资源读取器对象,没什么好看的,重点是setResourceLoader方法,通过Eclipse查看这个方法被调用的地方是在AbstractXmlApplicationContext的loadBeanDefinitions方法中。

通过AbstractXmlApplicationContext的继承体系可以知道AbstractApplicationContext是AbstractXmlApplicationContext的父类,而AbstractApplicationContext又是DefaultResourceLoader的子类,那getResourceLoader方法返回的对象自然也就是DefaultResourceLoader类型的了。进入DefaultResourceLoader的getResource方法。

这个方法是取得配置文件路径的具体实现,也就是实现了如何定位配置文件的功能,代码很简单,逻辑也很清楚。分别定位路径是以classpath为标识,以URL为标识和既不是以classpath为标识,也不是以URL标识的情况。既不是classpath也不是URL的情况是什么情况呢?文件系统的方式,比如本文中的”xxxxx.xml“,它的默认实现在FileSystemXmlApplicationContext类中。FileSystemXmlApplicationContext类中的这个方法是用protected修饰的,也就是说我们可以重写这个方法来实现我们自己的定位资源文件路径的方式。
资源文件的定位大致已分析完,接下来便是加载和解析配置文件。未完待续。。。。。。

IOC容器构造之资源文件定位源码分析相关推荐

  1. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  2. 插件式换肤框架搭建 - 资源加载源码分析

    资源加载源码分析 1.首先我们来看一下ImageView是如何加载资源的: public ImageView(Context context, @Nullable AttributeSet attrs ...

  3. Spark sql 读文件的源码分析

    从spark jobs监控页面上经常看到这种job:     Listing leaf files and directories for 100 paths: 如图:     这其实是spark s ...

  4. HDFS dfsclient写文件过程 源码分析

    HDFS写入文件的重要概念 HDFS一个文件由多个block构成.HDFS在进行block读写的时候是以packet(默认每个packet为64K)为单位进行的.每一个packet由若干个chunk( ...

  5. Android源码分析(十一)-----Android源码中如何引用aar文件

    一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...

  6. Spring配置详解,Spring配置元信息详解,Spring配置大全及源码分析

    文章目录 一.Spring都可以配置哪些元信息 二.Spring Bean 配置元信息 1.GenericBeanDefinition 2.RootBeanDefinition 3.Annotated ...

  7. java class源码查看_eclipse查看class文件的源码

    eclipse查看class文件的源码: 1.网上下载jadClipse的jar包和执行文件jad.exe和 net.sf.jadclipse_3.3.0.jar. 2.把上面下载的jar包放在ecp ...

  8. Spring 源码分析 (一)——迈向 Spring 之路

    一切都是从 Bean 开始的 在 1996 年,Java 还只是一个新兴的.初出茅庐的编程语言.人们之所以关注她仅仅是因为,可以使用 Java 的 Applet 来开发 Web 应用.但这些开发者很快 ...

  9. Android源码分析(三)-----系统框架设计思想

    一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...

  10. thinkphp6 框架源码分析

    一.入口概述 public/index.php // 执行HTTP应用并响应 $http = (new App())->setEnvName('local')->http;$respons ...

最新文章

  1. 深度学习必备---用Keras和直方图均衡化---数据增强
  2. conv_general_dilated实现
  3. (转载)OC学习篇之---KVC和KVO操作
  4. 微博收藏(机器学习代码与工具)(一)
  5. SSM整合(2): spring 与 mybatis 整合
  6. PCA方法对特征降维
  7. 轻量高效!清华智能计算实验室开源基于PyTorch的视频 (图片) 去模糊框架SimDeblur
  8. hdu1556(Color the ball )
  9. wxString中文出错的解决方法
  10. P1160 队列安排 洛谷
  11. mysql dba系统学习(15)mysql用户管理之二
  12. apache+php+mysql常见集成环境安装包
  13. FDD LTE对称吗?
  14. 云数据库RDS和对象存储OSS
  15. 用python做乘法口诀表_如何用python编写乘法口诀表
  16. matlab方波响应,对周期方波信号进行滤波matlab的实现
  17. 设置android模拟器屏幕自动旋转
  18. php新人笔记,PHP的简单小笔记
  19. 用js实现动态添加表格数据
  20. poi操作word常用操作方法,word工具包

热门文章

  1. ARCore之路-环境配置
  2. [opencv]学习之帧差法实现运动物体检测
  3. ldaptemplate 分页_分页机皮带跑偏调整方法
  4. logistic回归列线图(nomogram)的多种绘制方法
  5. day 09 学习Python——Python模块读取xls、slx文件,python发邮件
  6. PDF文档页面如何重新排版?
  7. 论文记载:FRAP:Learning Phase Competition for Traffic Signal Control
  8. python怎么写入txt文件_python 如何将数据写入本地txt文本文件的实现方法
  9. 使用SmartUpload的步骤
  10. 设计心理学-以用户为中心的设计