1 资源封装
在java中,将不同来源的资源抽象成URL,通过注册不同的Handler(URIStreamHandler)来处理不同来源的资源的读取逻辑,一般handler使用不同前缀(协议,protocol)来识别,如”file:”、”http:”、”jar:”,然后URL没有默认定义相对ClassPath或ServletContext等资源的handler,虽然可以注册自己的URLStreamHandler来解析特定的URL前缀,比如”classpath:”,但URL缺乏一些基本的方法,如检查当前资源是否存在、检查当前资源是否可读等方法。
因此Spring对其内部用到的资源实现自己的抽象结构:Resource接口来封装底层资源,resource接口抽象了所有Spring内部使用的底层资源:File、URL、Classpath等,并且增加了几个使用的方法,例如定义了判断当前资源状态的方法:存在性(exists)、可读性(isReadable)、是否处于打开状态(isOpen)。另外,resource接口还提供了不同资源到URL、URI、File类型的转换,并且提供了获得lastmodified属性名、文件名(不带路径信息的文件名,getFilename())的方法。
当通过Resource相关类完成了对配置文件进行封装后配置文件的读取工作就全权交给XMLBeanDefinitionsReader来进行下一步的处理
2 加载Bean
XmlBeanDefinitionReader.java
doLoadBeanDefinitions()方法其主要完成以下几个逻辑处理:
2.1 通过doLoadDocument(inputSource, resource)方法获取Document对象
XmlBeanDefinitionReader.java
DefaultDocumentLoader.java
2.2 通过registerBeanDefinitions(doc, resource)返回Document
DefaultDocumentLoader.java
2.3 通过getValidationModeForResource(Resource resource)获取验证模式
XmlBeanDefinitionReader.java
2.4 解析并注册BeanDefinitions
XmlBeanDefinitionReader.java
DefaultBeanDefinitionDocumentReader.java
DefaultBeanDefinitionDocumentReader.java
DefaultBeanDefinitionDocumentReader.java
registerBeanDefinitions()方法主要目的就是提取root,以便再次将root作为参数继续进行BeanDefinition的注册,parseBeanDefinitions()方法主要是针对默认标签和自定义标签进行解析,关于标签解析详细业务逻辑可以参照本系列博客第二篇。