读书人

Spring源码浅析 - XML配置文件的载入与

发布时间: 2012-10-13 11:38:17 作者: rapoo

Spring源码浅析 -- XML配置文件的载入与解析

最近在看Spring源代码,对配置文件信息的载入是使用Spring的第一步 ,而这第一步就是一个非常复杂的过程....
Spring通过定义BeanDefination来管理Ioc中的各种对象以及它们之间的依赖关系,所以载入的过程其实就是将XML文件读取并解析成BeanDefination数据的过程。
我们以最常使用的ClassPathXmlApplicationContext为切入点

1.?创建一个ClassPathXmlApplicationContext对象,传入文件路径

??

?它的第一步交给一个抽象方法refreshBeanFactory(), 具体的实现在AbstractRefreshableApplicationContext类中

?

第一步是判断是否已经创建过BeanFactory,如果是,将它销毁,重新创建
第二步就是创建各种ApplicationContext持有的真正容器实现类DefaultListableBeanFactory,创建Ioc容器

最后启动BeanDefination的载入? loadBeanDefinitions(beanFactory)方法

?

4.BeanFactory将载入工作交给BeanDefinationReader

loadBeanDefinitions(beanFactory)方法是抽象的,又因为我们的配置文件是XML格式的,所以具体实现实在AbstractXmlApplicationConext中

?

?

在此类中主要是对输入流进行编码操作,然后调用doLoadBeanDefinitions(inputSource, encodedResource.getResource())方法

?

5.XmlBeanDefinitionReader将载入工作交给W3C的dom

因为读入的文件是XML格式的,所以底层的实现肯定是要和W3C的dom结构打交道

doLoadBeanDefinitions(inputSource, encodedResource.getResource())方法正式引入dom

?
在此方法中生成了Document类的对象,下一步是进行对象的注册,registerBeanDefinitions(doc, resource)方法

?这里首先由BeanDefinitionParserDelegate 生成BeanDefination的包装类BeanDefinitionHolder ,然后再进行一些修饰工作,这里把工作正式交给BeanDefinitionParserDelegate

?

7.BeanDefinitionParserDelegate 中的解析工作

BeanDefinition的解析主要在BeanDefinitionParserDelegate 的parseBeanDefinitionElement(ele)方法中进行,重载到

?这个方法首先得到元素的name和id以及别名属性,然后再生成底层的AbstractBeanDefinition对象将它们包装生成BeanDefinitionHolder,其中包括bean的名称,别名,以及BeanDefinition,返回给上层方法

核心在于生成BeanDefinition的parseBeanDefinitionElement(ele, beanName, containingBean)方法

?

?

这个方法我们看起来一目了然,全部都是bean节点中的配置信息

首先得到class的名字,然后得到继承的parent的名字,然后是meta节点,look-up节点,replaced-method节点,构造函数设置节点,最后是比较复杂的property节点,我们继续分析比较复杂的property节点的解析,parsePropertyElements(ele, bd)方法

?
解析的主要过程,首先判断是否重复,如果重复抛出异常,然后对property节点内部进行解析,最后加入到bean节点信息中,我们继续解析property节点内部,parsePropertyValue(ele, bd, propertyName)方法

?
property节点主要是value和ref属性的配置,所以此方法首先是配置以上两个属性,然后是分析property节点的子元素,parsePropertySubElement(subElement, bd)方法,重载到

?

?这个方法内部也是一目了然,首先是配置property节点的内嵌bean,然后配置ref引用,然后是idref引用,接下来是内嵌的value元素,还有null元素,最后是一系列的复杂数据类型,array,list,set,map以及props。

?

到这里配置文件的载入基本上已经到底了,如果对以上元素的配置感兴趣的话,可以继续查看源代码。这里只是包含配置文件的载入过程,并不包括在Ioc容器中的注册,以及依赖注入的过程。

?

?

?

?

1 楼 XTU_xiaoxin 2010-08-20 其实,现在不缺Spring源码的资料,缺的是为什么Spring源码这么写?比如说spring各种工厂接口有什么用?或为什么要用BeanDefinationParserDelegate代理解析而不是直接解析呢?
个人观点:看源码意义不大,重要的是了解设计思想以及架构原理(越细越好)。不然,了解源码真的是吃力不讨好(伤脑力)
当然,能分析源码的,表明java技术绝对是上了一个等级了(楼主技术很强).我在此呼吁:
如果谁明白为什么Spring各种接口和类的组织原理,请赐教,这将是大众之福
2 楼 ted0928 2010-08-20 XTU_xiaoxin 写道 其实,现在不缺Spring源码的资料,缺的是为什么Spring源码这么写?比如说spring各种工厂接口有什么用?或为什么要用BeanDefinationParserDelegate代理解析而不是直接解析呢?
个人观点:看源码意义不大,重要的是了解设计思想以及架构原理(越细越好)。不然,了解源码真的是吃力不讨好(伤脑力)
当然,能分析源码的,表明java技术绝对是上了一个等级了(楼主技术很强).我在此呼吁:
如果谁明白为什么Spring各种接口和类的组织原理,请赐教,这将是大众之福

说的很有道理...支持 我还是学生 目前起点还是比较低 .. 3 楼 lirig 2010-08-21 XTU_xiaoxin 写道 其实,现在不缺Spring源码的资料,缺的是为什么Spring源码这么写?比如说spring各种工厂接口有什么用?或为什么要用BeanDefinationParserDelegate代理解析而不是直接解析呢?
个人观点:看源码意义不大,重要的是了解设计思想以及架构原理(越细越好)。不然,了解源码真的是吃力不讨好(伤脑力)
当然,能分析源码的,表明java技术绝对是上了一个等级了(楼主技术很强).我在此呼吁:
如果谁明白为什么Spring各种接口和类的组织原理,请赐教,这将是大众之福

看源代码非常有必要,t特别是spring的,要明白原理最好还是看源代码,spring里面用了好多种常用设计模式,要彻底理解思想和架构原理,看源代码还是一种非常不错的选择。 4 楼 XTU_xiaoxin 2010-08-23 lirig 写道XTU_xiaoxin 写道 其实,现在不缺Spring源码的资料,缺的是为什么Spring源码这么写?比如说spring各种工厂接口有什么用?或为什么要用BeanDefinationParserDelegate代理解析而不是直接解析呢?
个人观点:看源码意义不大,重要的是了解设计思想以及架构原理(越细越好)。不然,了解源码真的是吃力不讨好(伤脑力)
当然,能分析源码的,表明java技术绝对是上了一个等级了(楼主技术很强).我在此呼吁:
如果谁明白为什么Spring各种接口和类的组织原理,请赐教,这将是大众之福

看源代码非常有必要,t特别是spring的,要明白原理最好还是看源代码,spring里面用了好多种常用设计模式,要彻底理解思想和架构原理,看源代码还是一种非常不错的选择。

对,你把楼主贴出的源码看了一遍,我想问你:你明白了什么设计模式,模板模式?命令模式?
就算了你看出了用的几个模式,我又问你:为什么要用这种模式呢?这里用模式的好处是什么呢?
望赐教!

读书人网 >XML SOAP

热点推荐