Spring NamespaceHandler详解


一、概述

  字面意思命名空间处理器,作用是用来解析spring xml标签(自定义spring标签),生成BeanDefinition

public interface NamespaceHandler {
  //初始化向spring框架注册bean定义
    void init();
  //解析标签 @Nullable BeanDefinition parse(Element element, ParserContext parserContext); @Nullable BeanDefinitionHolder decorate(Node source, BeanDefinitionHolder definition, ParserContext parserContext); }

  如其他框架自定义标签整合到spring中:

    

二、源码分析(以DubboNamespaceHandler为列)

  DubboNamespaceHandler源码如下: init()方法中每个标签都会被解析类解析成相应的BeanDefinition注册到spring容器中

public class DubboNamespaceHandler extends NamespaceHandlerSupport {

    static {
        Version.checkDuplicate(DubboNamespaceHandler.class);
    }

    @Override
    public void init() {
        registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.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());
    }

}

  

DubboNamespaceHandler何时被调用:
  spring启动时会扫描引入jar包中META-INF下的spring.handlers中的实现类(SPI可插拔技术)
  

 
spring.handlers内容如下:
http\://dubbo.apache.org/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler

 spring如何知道自定义标签:

  同上会扫描spring.schemas中的内容指定标签的位置

http\://dubbo.apache.org/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd
http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/compat/dubbo.xsd

  标签部分内容(标红的部分该标签路径,spring启动xml中想使用该标签要引入):

     

  如下自定义标签时如何引入(这样就可以使用<test:service标签):    

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ok="http://code.hujian.com/schema/ok"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://code.test.com/schema/test
           http://code.hujian.com/schema/test/test-1.0.xsd">

    <test:service id="testServer" serverName="HelloService"/>

</beans>

 

三、自定义spring标签步骤

  1、NamespaceHandler实现类处理自定义标签的处理器

  2、自定义解析BeanDefinitionParser解析器

  3、自定义标签

  4、spring.handlers、spring.schemas中写入处理器、标签的位置

  可参考:https://www.jianshu.com/p/ee199b7ec65b 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM