本篇文章主要讲一下Spring 如何取自定义自己的XML标签:
1. 首先要自定义自己的XSD文件
说明:
首先这个文件最好建立在静态资源resource
文件夹下,我为了方便都将文件建立在了resource/META-INF下了,包括spring.handlers
和spring.schemas
这三个文件都在该目录下:
mytag.xsd
文件如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://hellospring.vipbbo.com/schema/tag"
targetNamespace="http://hellospring.vipbbo.com/schema/tag"
elementFormDefault="qualified">
<xsd:element name="model">
<xsd:complexType>
<xsd:attribute name="name" type="xsd:string">
</xsd:attribute>
<xsd:attribute name="age" type="xsd:int">
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
- 说明
首先这个
-
xmlns:xsd="http://www.w3.org/2001/XMLSchema"必须要写;
-
xmlns="http://hellospring.vipbbo.com/schema/tag"和 ** targetNamespace=**"http://hellospring.vipbbo.com/schema/tag"这两个参数需要保持一致。
2. 定义一个和XSD文件所对应的实体类
代码如下:
package com.vipbbo.spring.bean.customtag;
public class Model {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3. 创建一个自定义的BeanDefinitionParser实现BeanDefinitionParser
代码如下:
package com.vipbbo.spring.bean.customtag;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
public class MyBeanDefinitionParser implements BeanDefinitionParser {
private final Class<?> beanClass;
public MyBeanDefinitionParser(Class<?> beanClass) {
this.beanClass = beanClass;
}
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(beanClass);
genericBeanDefinition.setLazyInit(false);
genericBeanDefinition.getPropertyValues().add("name", element.getAttribute("name"));
genericBeanDefinition.getPropertyValues().add("age", element.getAttribute("age"));
parserContext.getRegistry().registerBeanDefinition(beanClass.getName(),genericBeanDefinition);
return null;
}
}
4. 创建一个NamespaceHandler继承自NamespaceHandlerSupport
代码如下:
package com.vipbbo.spring.bean.customtag;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MyNameSpaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("model",new MyBeanDefinitionParser(Model.class));
}
}
PS:文件Model、MyBeanDefinitionParser、MyNameSpaceHandler项目层级如下:
5. 编写前面提到的spring.handlers和spring.schemas两个文件
spring.handlers
文件内容如下:
http\://hellospring.vipbbo.com/schema/tag=com.vipbbo.spring.bean.customtag.MyNameSpaceHandler
spring.schemas
文件内容如下:
http\://hellospring.vipbbo.com/schema/tag/mytag.xsd=META-INF/mytag.xsd
PS:
这两个文件都是properties格式的文件,这两个文件和开头的那个xsd都要放在resource目录下的META-INF文件夹下,再注意Spring.Handlers中的key是要和上面xsd中你自己定义的xmlns一致,value一定要指向你自己定义的NameSpaceHandler的全路径,Spring.schemas中key前半部分是自己定义的xmlns,后半部分的mytag.xsd就是你自己xsd的文件名.
6. 编写xml
custom-tag.xml
文件内容如下:
<?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:mytag="http://hellospring.vipbbo.com/schema/tag"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://hellospring.vipbbo.com/schema/tag
http://hellospring.vipbbo.com/schema/tag/mytag.xsd
">
<!-- <bean id="myTestTag" class="com.vipbbo.spring.bean.customtag.MyTagTest" name="tagTest"/>-->
<mytag:model name="paidaxing" age="18"/>
</beans>
7. 编写测试类
package com.vipbbo.spring.bean.customtag;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTagTest {
@Test
public void TagTest(){
ApplicationContext ac =
new ClassPathXmlApplicationContext("custom-tag.xml");
Model model = (Model) ac.getBean(Model.class.getName());
System.out.println(model.getAge());
System.out.println(model.getName());
}
}
运行结果如下:
整理不易,如果对你有所帮助欢迎点赞关注
微信搜索【码上遇见你】获取更多精彩内容