spring 源码解析 —— loadBeanDefinitio
spring 容器启动时可以分解成两部分,第一部分为元数据的加载,第二部分即为bean的实例化,这一章节主要从第一部分开始讲解。分析源码前,先看看spring xml配置和使用到的bean信息。
图一:spring xml 配置文件 图二:启动 spring 容器 图三:Person 类 图四:Stu 类当执行截图二中的main方法时,第11行,加载test-spring.xml配置文件。本章节主要讲述的是spring如何加载配置文件,如何解析其中的各个element,解析完成之后是如何存储bean的元数据,带着这三个问题,我们一起进入源码。
BeanFactory beanFactory =new XmlBeanFactory(new ClassPathResource("config/spring/test-spring.xml"));首先一起看下创建ClassPathResource对象时spring容器做了哪些操作。
图五:创建 ClassPathResource 对象从截图中可以看出,创建ClassPathResource对象主要是获取配置文件的相对路径和设置类的加载器。当拿到了配置文件的路径时,下面就是要对配置文件进行加载和解析等操作了。
图六:初始化容器入口 图七:设置编码和字符集 图八:doLoadBeanDefinition 准备doLoadBeanDefinition 需要特别关注,是执行加载元数据到容器中重要方法。进入方法,查看在加载过程中spring容器都有哪些操作。
图九:解析xml和注册bean信息入口当源码看到此处时,已经到了spring容器解析xml文件和注册bean信息入口了,下面将分别针对截图中的 步骤1和步骤2进行一个详细的讲解。
1、doLoadDocument(inputSource,resource);
方法作用:
(1)获取xml配置文件的模式:自定义,dtd,xsd
(2)获取EntityResolver对象,进行nameSpaceUrl进行解析
(3)对于配置xml文件格式进行验证并且转化为Document对象
下面分别对以上的功能点进行源码层面上的分析。
2、registerBeanDifinitions(doc,resource)
图十二:注册beanDifinition入口上方截图中通过1,2分别记录注册前和注册后beanDifinition数量,做差值计算一共注册了多少个bean的信息。
3就是注册beanDifinition的入口了。
到达这一部分,spring标签解析已经到达了精彩的部分,再次需要解释一下什么是自定义标签和默认标签。
spring 默认标签即spring原生标签:beans,bean,import,alias,只有四个
spring 自定义标签:context:component-scan ,aop:aspectj-autoproxy等等。
从截图的判断可以看出,针对于不同的标签,spring是提供了不同的解析方式的,接下来就是对于不同标签的解析过程。