自定义标签
1. 创建spring.schemas文件2. 创建mytags.xsd文件3. spring.xml添加自定义标签4. 创建实体类TagTag5. 创建处理类TagParser6. 映射标签和处理类7. 创建spring.handlers文件8. 测试方法代码下载地址
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() {
}
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.classdoParse将标签内的属性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. 测试方法
查看打印
代码下载地址
https://gitee.com/fisher3652/spring.git