自定义标签
1. 创建spring.schemas文件
-在resources文件夹下创建META-INF目录,创建文件spring.schemas,建立xsd文件映射关系
http\://www.csdn.com/schema/mytags.xsd=META-INF/mytags.xsd
2. 创建mytags.xsd文件
- 指定namespaceuri,标签名称,属性元素
3. spring.xml添加自定义标签
4. 创建实体类TagTag
- 需要有参构造方法,因为自定义标签属性ip=“192.168.42.111” port="6379是通过有参构造方法设置的属性,没有这个会报错
package org.example.tag;
import org.springframework.stereotype.Component;
@Component
public class TagTag {
private String ip;
private String port;
public TagTag() {
}
//需要有参构造方法,因为自定义标签属性ip="192.168.42.111" port="6379是通过有参构造方法设置的属性,没有这个会报错
public TagTag(String ip, String port) {
this.ip = ip;
this.port = port;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
}
5. 创建处理类TagParser
- 只需要继承AbstractSingleBeanDefinitionParser即可,不要实现顶层接口BeanDefinitionParser,这样需要自己重写很多方法,继承AbstractSingleBeanDefinitionParser,可以使用AbstractSingleBeanDefinitionParser已经写好的一些方法,解析标签通过继承的父类来完成。
- getBeanClass(Element element)是一个空方法,需要自己实现。
- doParse也是空方法,需要自己实现
- 重写getBeanClass和doParse方法
- getBeanClass返回需要注入使用的实体类TagTag.class
- doParse将标签内的属性ip和port设置到BeanDefinition对象的ConstructorArgumentValues属性中(即通过构造方法设置属性)
package org.example.tag;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;
public class TagParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return TagTag.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder builder) {
String ip = element.getAttribute("ip");
String port = element.getAttribute("port");
builder.addConstructorArgValue(ip);
builder.addConstructorArgValue(Integer.parseInt(port));
}
}
6. 映射标签和处理类
- 继承NamespaceHandlerSupport,重写init方法,指定tagTest标签的处理类
package org.example.tag;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class TagsNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
this.registerBeanDefinitionParser("tagTest", new TagParser());
}
}
7. 创建spring.handlers文件
- 指定namespaceuri对应的初始化类
http\://www.csdn.com/schema/mytags=org.example.tag.TagsNamespaceHandler
8. 测试方法
- 查看打印