AI智能
改变未来

Spring5 扩展篇之自定义xml标签

本篇文章主要讲一下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>
  • 说明

首先这个

  1. **xmlns:xsd="http://www.w3.org/2001/XMLSchema"**必须要写;

  2. 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;}@Overridepublic 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 {@Overridepublic void init() {registerBeanDefinitionParser("model",new MyBeanDefinitionParser(Model.class));}}

PS:文件ModelMyBeanDefinitionParserMyNameSpaceHandler项目层级如下:

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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://hellospring.vipbbo.com/schema/taghttp://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 {@Testpublic 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());}}

运行结果如下:

整理不易,如果对你有所帮助欢迎点赞关注

微信搜索【码上遇见你】获取更多精彩内容

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Spring5 扩展篇之自定义xml标签