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