接着上一篇顺藤摸瓜,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容器构造之资源文件定位源码分析
最新推荐文章于 2021-11-05 21:09:00 发布