Xc's Blog

在spring中定义自己的xsd和对应的解析器

2018/04/15 Share

用途

可以自定义自己的xml标签和解析器,封装实现类,简化使用者的代码,而且比较Coooooool

配置文件

Spring 会扫描每个包下的META-INF/spring.schemas文件,用户可以在这个文件下定义自己的xsd

对应方式为:

xsd的虚拟html地址=xsd的文件地址

写完schema后需要有对应的handler来处理,handler和schema的定义关系保存在META-INF/spring.handlers

对应方式为:

xsd的虚拟html地址=Handler类名

JAVA代码

Handler 需要继承NamespaceHandlerSupport,在init方法中绑定元素名称和对应的Parser.

例子

META-INF/spring.schemas:

1
http\://autoconfig.jd.com/schema/autoconfig/autoconfig.xsd=META-INF/autoconfig.xsd

META-INF/spring.handlers

1
http\://autoconfig.jd.com/schema/autoconfig=com.jd.autoconfig.AutoConfigNamespaceHandler

AutoConfigNamespaceHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.jd.autoconfig;

public class AutoConfigNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
this.registerBeanDefinitionParser("enable-autoconfig", new SwitchParser());
this.registerBeanDefinitionParser("ucc-provider", new UccProviderParser());
}


static class SwitchParser implements BeanDefinitionParser {
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(AutoConfigManager.class);
return beanDefinition;
}
}

static class UccProviderParser implements BeanDefinitionParser {
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
String id = element.getAttribute("id");
String path = element.getAttribute("path");
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(UCCProvider.class);
beanDefinition.getPropertyValues().add("path",path);
parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
return beanDefinition;
}
}

}
CATALOG
  1. 1. 用途
  2. 2. 配置文件
  3. 3. JAVA代码
  4. 4. 例子