美文网首页我的文章-Spring
xml 文件解析成 BeanDefinition

xml 文件解析成 BeanDefinition

作者: 飞翔的鲲 | 来源:发表于2018-08-03 17:09 被阅读4次
    • 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() 使用动态代理生成的。

    相关文章

      网友评论

        本文标题:xml 文件解析成 BeanDefinition

        本文链接:https://www.haomeiwen.com/subject/gymyvftx.html