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