一、概述
字面意思命名空間處理器,作用是用來解析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中寫入處理器、標簽的位置