博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-基于可扩展Schema的特性自定义标签
阅读量:6277 次
发布时间:2019-06-22

本文共 3257 字,大约阅读时间需要 10 分钟。

hot3.png

引言

从spring 2.0开始,spring开始支持基于schema的bean的配置和定义,即通过标签定义和配置bean交由spring容器管理,它和通过spring的<bean>标签定义bean是相同的,但对于用户更透明和友好。

例如,需要配置User bean,通过spring提供的bean标签配置如下:

如果gender属性只接受male和female,这在bean标签中是不可控的,但我们通过自定义扩展spring的bean标签后,可以做到属性可控。另外,哪些是必须的,哪些是可选的,这都可以通过自定义标签做到。

想写自定义标签,但首先需要了解 XML Schema Definition(XSD) ,这里仅对一些遇到的标签说明,其它请各位自学。

需求与实现

需求

** 自定义一个自定义标签mytag.xsd,其中一个元素节点为user,元素有四个属性分别是name、age、addr、gender,其中name/age/addr为必须填写的,gender是可选的并且是枚举类型。 **

spring官方文档详细地说明了扩展schema标签的步骤,如果英文好的话可以去看看,不行的话那往下看吧。

实现

实现以上需求需要完成以下步骤:

  • 设计配置属性和JavaBean
  • 编写XSD文件,定义标签的属性
  • 编写NamespaceHandler和BeanDefinitionParser完成解析工作
  • 编写spring.handlers和spring.schemas文件,串联起所有部件
  • 在spring Bean配置文件中引用

先看一下完成需求后的工程结构:

输入图片说明

(1)设计配置属性和JavaBean

//User.javapackage com.github.thinwonton.spring.schema;public class User {	private String name;	private int age;	private String addr;	private String gender;    //忽略getter/setter	@Override	public String toString() {		return "User [name=" + name + ", age=" + age + ", addr=" + addr + ", gender=" + gender + "]";	}}

(2)编写XSD文件,定义标签的属性。xsd文件名:mytag.xsd。

说明:

  • xsd:element 表示定义标签
  • xsd:extension 如java中的继承,把现有的定义继承进来
  • xsd:attribute 标签带有的属性
  • xsd:restriction 对标签改属性进一步的限制,进行一些值的约束

(3) 编写NamespaceHandler和BeanDefinitionParser完成解析工作

//UserBeanDefinitionParser.javapublic class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {	@Override	protected Class
getBeanClass(Element element) { return User.class; } @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { // 获取属性 String name = element.getAttribute("name"); int age = Integer.parseInt(element.getAttribute("age")); String addr = element.getAttribute("addr"); String gender = element.getAttribute("gender"); // 给bean赋值 builder.addPropertyValue("name", name); builder.addPropertyValue("age", age); builder.addPropertyValue("addr", addr); builder.addPropertyValue("gender", gender); }}
public class MytagNamespaceHandler extends NamespaceHandlerSupport {	@Override	public void init() {         //"user"对应于xsd文件里面的
//这里的意思是告诉spring使用UserBeanDefinitionParser解析器解析user这个元素 registerBeanDefinitionParser("user", new UserBeanDefinitionParser()); }}

(4)编写spring.handlers和spring.schemas文件,串联起所有部件

spring.schemas文件,把命令空间与工程中的具体定义文件相关联

http\://www.github.com/thinwonton/schema/mytag/mytag.xsd=META-INF/mytag.xsd

spring.handlers文件,告诉spring该让哪个命令空间处理器处理xsd定义的一堆元素

http\://www.github.com/thinwonton/schema/mytag=com.github.thinwonton.spring.schema.MytagNamespaceHandler

(5)在spring配置文件中引用

引入schema,把schema的命令空间给一个缩写名mytag

这里可能发生命名控件不能识别的问题,这是因为我们的文件没有上传到网络上,这时我们需要在eclipse中指定命令空间的解析地址映射到本地文件中。

输入图片说明

测试:

public class Main {	public static void main(String[] args) {		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");		User user = context.getBean(User.class);		System.out.println(user.toString());	}}

相关资料

  • 代码

项目里的spring-schema-extend工程

  • 具体应用 dubbo标签定义

转载于:https://my.oschina.net/thinwonton/blog/878090

你可能感兴趣的文章
大数据将如何改变农业
查看>>
《JavaScript和jQuery实战手册(原书第2版)》——第3章为程序添加逻辑和控制
查看>>
Google一年检测出超过76万个恶意网站
查看>>
遵义市 大数据产业汇聚八方人才
查看>>
教会委员会呼吁奥巴马宽恕斯诺登
查看>>
《Android的设计与实现:卷I》——第3章 3.6init循环监听处理事件
查看>>
联发科与高通平分秋色,消费者真不在乎处理器?
查看>>
台湾移动市场电信服务价格竞争预计将放缓
查看>>
《领域特定语言》一2.6 设计优良的DSL从何而来
查看>>
IDC圈探营:山西联通太原云数据中心
查看>>
呼叫中心还是客户中心?
查看>>
如何选择适当的低照度红外摄像机
查看>>
惠普企业总裁表示边缘计算将推动本地部署数据中心的需求
查看>>
数据说话|新华三近百个项目通过泰尔实验室测试
查看>>
CloudCC CRM探讨CRM如何提高客户的盈利性
查看>>
印度迎来可再生能源产业大发展
查看>>
光伏制造业“融资难、融资贵”问题亟待破解
查看>>
Java Mail最基本的发送邮件例子
查看>>
《HTML 5与CSS 3 权威指南(第3版·上册)》——2.3 新增的属性和废除的属性
查看>>
《Total Commander:万能文件管理器》——第3.5节.选择文件
查看>>