本文共 3629 字,大约阅读时间需要 12 分钟。
java web开发者对spring都不陌生,项目会用到,刚开始学完,别人配制好了就可以了,也不懂为啥这些标签怎么引用到项目里,为啥引用完这些标签就可以加载了这个bean了。工作一段时间对这些东西比较好奇,所以就学了一下,spring自定义标签,扩展scheme的过程。
先说一下自定义标签的过程,
1、创建标签实体类
2、定义标签的描述 XSD 文件
3、创建一个标签元素解析器,实现 BeanDefinitionParser 接口
4、创建一个 handler 类,继承自 NamespaceHandlerSupport
5、编写 spring.handlers 和 spring.schemas 文件
说明:
步骤1,自定义标签实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public class SysUser { /** * 自增主鍵 */ private long id; /** * 用戶名 */ private String name; /** * 密码 */ private String password; public long getId() { return id; } public void setId( long id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public String getPassword() { return password; } public void setPassword(String password) { this .password = password; } } |
步骤2:定义标签的 XSD 文件 sysuer.xsd,一会会有用放入到具体的位置上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <? xml version = "1.0" encoding = "UTF-8" ?> < schema xmlns = "http://www.w3.org/2001/XMLSchema" targetNamespace = "http://www.sdc.org/schema/alias" xmlns:tns = "http://www.sdc.org/schema/alias" elementFormDefault = "qualified" > < element name = "sysuer" > < complexType > < attribute name = "id" type = "long" /> < attribute name = "name" type = "string" /> < attribute name = "password" type = "string" /> < attribute name = "email" type = "string" /> < attribute name = "phone" type = "string" /> </ complexType > </ element > </ schema > |
步骤3;创建标签解析器,继承了AbstractSingleBeanDefinitionParser这个抽象类。当遇到sysuer标签的时候,会交给这个标签来解析。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class SysUerBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { @Override protected Class<?> getBeanClass(Element element) { return SysUser. class ; } @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { String id = element.getAttribute( "id" ); String name = element.getAttribute( "name" ); String password = element.getAttribute( "password" ); //把对应的属性设置到bean中 if (StringUtils.hasText(id)) builder.addPropertyValue( "id" , id); if (StringUtils.hasText(name)) builder.addPropertyValue( "name" , name); if (StringUtils.hasText(password)) builder.addPropertyValue( "password" , password); } } |
步骤4,编写namespacehandler,用于解析我们自定义名字空间下的所有元素。里面包含了三个方法。
init()会在NamespaceHandler初始化的时候被调用。
BeanDefinition parse(Element, ParserContext) - 当Spring遇到一个顶层元素的时候被调用。
BeanDefinitionHolder decorate(Node, BeanDefinitionHolder, ParserContext) - 当Spring遇到一个属性或嵌套元素的时候调用.
1 2 3 4 5 6 7 8 9 10 | public class SysUserNamespaceHandler extends NamespaceHandlerSupport{ @Override public void init() { // TODO Auto-generated method stub //遇到sysuer元素的时候交给SysUseBeanDefinitionParser来解析 registerBeanDefinitionParser( "sysuer" , new SysUerBeanDefinitionParser()); } } |
步骤5:
编写spring的配制文件
1 2 3 4 5 6 7 8 9 | <? 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:context = "http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.test.com/schema/sysuer http://www.test.com/schema/sysuer.xsd "> <!-- <sysuer:sysuer id="1111" name="srr" password="pwd"/> --> |
最后写,handler和schema的两个文件下的文件,spring默认的是找到这两个文件夹下的文件。请看这个文件下的是怎么编写的。
完美,测试类,可以自己写一个获取spring配置文件的类来测试就可以了。
本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1950156
转载地址:http://heqpo.baihongyu.com/