Dubbo自定义标签解析原理

Dubbo标签解析,因为是自己看的源码,从DubboNamespaceHandler开始看。

源码翻看基础:了解spirng自定义标签的解析。

  spring自定义标签知识:

Spring允许你创建自定义的XML标签以简化和定制配置。要解析自定义Spring XML标签,你需要创建一个自定义的命名空间和标签解析器。以下是创建和解析自定义Spring XML标签的一般步骤:

  1. 创建自定义标签定义: 首先,你需要定义你的自定义标签。这包括创建一个XML命名空间、XSD架构文件和自定义标签的定义。通常,这些文件包括以下几个部分:

    • XML命名空间声明:定义你的自定义XML命名空间以及命名空间的URL。
    • XSD架构文件:定义你的自定义标签的元素、属性等详细结构。这通常是一个XSD文件。
    • 自定义标签定义:定义你的自定义标签的名称、属性和元素。
  2. 创建标签解析器: 接下来,你需要创建一个Java类,这个类将充当自定义标签的解析器。这个类需要实现Spring的BeanDefinitionParser接口,通常会继承AbstractSingleBeanDefinitionParserAbstractBeanDefinitionParser。你需要实现parseInternal方法来解析标签的属性和元素,并创建相应的BeanDefinition

  3. 注册标签解析器: 在Spring的配置文件中,你需要注册你的自定义标签解析器。这通常是通过在XML配置文件中使用<bean>元素来完成的。

  4. 使用自定义标签: 现在,你可以在Spring配置文件中使用你的自定义标签。确保在XML文件的顶部引入你的命名空间,并使用你的自定义标签。

  5. 加载和启动Spring应用: 最后,加载和启动Spring应用程序。当Spring容器启动时,它将解析和处理你的自定义标签,创建相应的BeanDefinition,并将它们注册到应用程序上下文中

1.例如一个xml中定义一个自定义标签:

  <test:testBean id="testBean" name="Rob Harrop" age="23"/>

2.对自定义标签解析

final class TestNamespaceHandler extends NamespaceHandlerSupport {

   @Override

   public void init() {

      //注册parser

      registerBeanDefinitionParser("testBean", new TestBeanDefinitionParser());

 

   }

3.解析类:

private static class TestBeanDefinitionParser implements BeanDefinitionParser {
 
   @Override
   public BeanDefinition parse(Element element, ParserContext parserContext) {
 
      RootBeanDefinition definition = new RootBeanDefinition();
      definition.setBeanClass(CustomBean.class);
 
      MutablePropertyValues mpvs = new MutablePropertyValues();
      mpvs.add("name", element.getAttribute("name"));
      mpvs.add("age", element.getAttribute("age"));
 
      //1.设置beanDefinition的 属性 propertyValues
      definition.setPropertyValues(mpvs);
 
      //2.获取到beanDefinition的 registry
      parserContext.getRegistry().registerBeanDefinition(element.getAttribute("id"), definition);
      return null;
   }
}

handler解析类的入口是init方法的覆盖。

下面看org.apache.dubbo.config.spring.schema.DoubleNamespaceHandler这个类的init方法。

 registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        registerBeanDefinitionParser("config-center", new DubboBeanDefinitionParser(ConfigCenterBean.class, true));
        registerBeanDefinitionParser("metadata-report", new DubboBeanDefinitionParser(MetadataReportConfig.class, true));
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        registerBeanDefinitionParser("metrics", new DubboBeanDefinitionParser(MetricsConfig.class, true));
        registerBeanDefinitionParser("ssl", new DubboBeanDefinitionParser(SslConfig.class, true));
        registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
        registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
        registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
        registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());

这里有多个double的标签,我们看DubboBeanDefinitionParser类的parse方法。

看这个方法前,先熟悉一下spring解析的api。

RootBeanDefinition definition= new RootBeanDefinition();
        definition.setBeanClass(getClass());
        definition.setLazyInit(false);
        String id=element.getAttribute("id");
        if (StringUtils.isEmpty(id)) {
            String name=element.getAttribute("name");
        }
        //给bean添加属性
        definition.getPropertyValues().addPropertyValue(id, "sadf");
        
        //是否包含一个bean
        parserContext.getRegistry().containsBeanDefinition("");
        //注册
        parserContext.getRegistry().registerBeanDefinition(id, definition);
        return definition;
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jyyy410

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值