BeanDefinitionReader接口:BeanDefinitionReader 读取、解析 Resource 资源,负责BeanDefinition的资源定位和载入
BeanDefinitionRegistry getRegistry() 获取注册定义接口 ResourceLoader getResourceLoader() 获取资源加载类 ClassLoader getBeanClassLoader() 获取类加载器 BeanNameGenerator getBeanNameGenerator() beanName获取 loadBeanDefinitions(Resource resource) 通过resource 加载资源
AbstractBeanDefinitionReader :实现接口BeanDefinitionReader的bean定义reader抽象基类,提供常见的属性,工作的bean工程,用于加载bean的加载器。 loadBeanDefinitions 1、获取资源加载器 2、判断资源加载器类型,如果是ResourcePatternResolver(classpath)将指定位置的bean定义只有文件解析为IOC容器封装的资源 3、其他类型,将指定位置的Bean定义资源文件解析为IOC容器封装的资源,加载单个指定位置的Bean定义资源文件,通过resourceLoader.getResource Resource,委派调用子类loadBeanDefinitions实现加载功能。
XmlBeanDefinitionReader 以XML形式完成对bean的解析与载入,最终完成BeanDefinition的装配加载BeanDefintion的4个接口方法,返回加载beanDefinition的个数 loadBeanDefinitions(Resource resource) loadBeanDefinitions(EncodedResource encodedResource) loadBeanDefinitions(InputSource inputSource) loadBeanDefinitions(InputSource inputSource, @Nullable String resourceDescription)
XmlWebApplicationContext解析配置文件分为以下两个过程:
1、创建并出示XmlBeanDefinitionReader。在XmlWebApplicationContext创建完BeanFactory的时候会调用loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
容器向BeanDefinitionReader提供了3个对象,资源环境Evironment对象,用于判断beans标签的profile属性,第二个是资源加载器ResourceLoader对象,第三个是用于加载xml验证文件的dtd EntityResolver对象
创建XmlBeanDefinitionReader
2、使用XmlBeanDefinitionReader提供的接口方法来加载BeanDefinition
加载Document对象,使用DocumentLoader来加载Document对象,
使用标准的JAXP将载入的Bean定义资源转换成document对象
注册BeanDefinition registerBeanDefinitions(doc, resource)
1、获取BeanDefinitionDocumentReader来对xml格式的BeanDefinition解析
2、具体的解析通过委派模式DefaultBeanDefinitionDocumentReader
registerBeanDefinitions(Document doc, XmlReaderContext readerContext)
根据Spring dtd 对bean的定义规则解析bean定义Docment对象,具体解析过程由
BeanDefinitionParserDelegate实现,定义xml文件的各种元素 1、判断是否默认命名空间 2、preProcessXml(root) 在解析Bean定义之前,进行自定义的解析,增强解析过程的可扩展性 3、parseBeanDefinitions(root, this.delegate) 解析Document对象 判断根对象的命名空间,获取所有子节点,循环获取Node节点 parseBeanDefinitionElement 解析Bean定义资源文件中的Bean元素,id,name,别名 ,返回BeanDefinitionHolder,bean定义封装类 BeanDefinitionReaderUtils.registerBeanDefinition 向Spring容器注册解析到的bean定义信息 4、postProcessXml(root) 解析后扩展