前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring5 扩展篇之自定义xml标签

Spring5 扩展篇之自定义xml标签

作者头像
@派大星
发布2023-06-28 14:35:29
2560
发布2023-06-28 14:35:29
举报
文章被收录于专栏:码上遇见你

本篇文章主要讲一下Spring 如何取自定义自己的XML标签:

1. 首先要自定义自己的XSD文件

说明:

首先这个文件最好建立在静态资源resource文件夹下,我为了方便都将文件建立在了resource/META-INF下了,包括spring.handlersspring.schemas这三个文件都在该目录下:

mytag.xsd文件如下:

代码语言:javascript
复制
<?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文件所对应的实体类

代码如下:

代码语言:javascript
复制
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

代码如下:

代码语言:javascript
复制
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

代码如下:

代码语言:javascript
复制
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:文件ModelMyBeanDefinitionParserMyNameSpaceHandler项目层级如下:

5. 编写前面提到的spring.handlers和spring.schemas两个文件

spring.handlers文件内容如下:

代码语言:javascript
复制
http\://hellospring.vipbbo.com/schema/tag=com.vipbbo.spring.bean.customtag.MyNameSpaceHandler

spring.schemas文件内容如下:

代码语言:javascript
复制
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文件内容如下:

代码语言:javascript
复制
<?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. 编写测试类
代码语言:javascript
复制
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());
	}
}

运行结果如下:

如果出现上述情况:

那么恭喜你,你已经可以自己定义一个灰常简单的xml标签了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 首先要自定义自己的XSD文件
  • 2. 定义一个和XSD文件所对应的实体类
  • 3. 创建一个自定义的BeanDefinitionParser实现BeanDefinitionParser
  • 4. 创建一个NamespaceHandler继承自NamespaceHandlerSupport
  • 5. 编写前面提到的spring.handlers和spring.schemas两个文件
  • 6. 编写xml
  • 7. 编写测试类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档