xml 文件解析成 BeanDefinition

  • xml 标签解析
    DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions()


    image.png
  • xml系统标签和自定义标签解析
    DefaultBeanDefinitionDocumentReader.parseBeanDefinitions()


    image.png

<bean/> 这种为系统标签,使用parseDefaultElement()方法解析。

<context:component-scan base-package="xxx"/> 这种为自定义标签,使用parseCustomElement()方式解析

自定义标签解析


处理需要命名空间解析器,和命名空间处理器。

image.png
  • 命名空间解析器NamespaceHandlerResolver,这一般只有一个实现类DefaultNamespaceHandlerResolver。

  • 命名空间处理器 NamespaceHandler, 需要自定义处理器,解析自定义标签。
    比如MvcNamespaceHandler,初始化的时候定义标签及解析器。


    image.png
  • 找标签对应的处理器


    image.png

elasticsearch 扫描接口生成 beanDefinition 过程


解析标签
<elasticsearch:repositories base-package="com.ymm.trade.es.repository"/>

参考 https://www.jb51.net/article/143403.htm

  • 找到 scheme 的处理器


    image.png
image.png
  • 解析 标签 elasticsearch:repositories
    RepositoryBeanDefinitionParser.parse()
    第二个框中,生成了所有接口的 BeanDefinition,完成了配置到bean定义过程。


    image.png
  • 生成 beanDefinition
    这里的beanDefinition只是半成品,还没有生成完。
    ClassPathScanningCandidateComponentProvider.findCandidateComponents()
    追到最后,发现直接扫描包下面的接口文件,获取接口文件类信息,并生成对应beanDefinition,后面再添加其他属性。没发现使用注解生成bean,一开始以为使用注解定义bean的。。。


    image.png
  • 处理注解信息,这里注解只是增强功能,没有过滤功能
    RepositoryComponentProvider.findCandidateComponents()


    image.png
  • 根据之前的beanDefinition,生成需要的beanDefinition,同时加入了属性
    框中会在beanDefinition中加入属性。


    image.png
  • 最终生成接口实现类
    扫描实现ElasticsearchCrudRepository接口类的包,最终根据接口生成实现类。实现类为ElasticsearchRepositoryFactoryBean。
    当注入bean的时候,如果是FactoryBean,系统会调取它的getObject()方法注入实际对象。
    实际对象通过ElasticsearchRepositoryFactoryBean的getObject()生成,最终是通过调用ElasticsearchRepositoryFactory.getRepository() 使用动态代理生成的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容