一、概述
字面意思命名空间处理器,作用是用来解析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中写入处理器、标签的位置