博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring - 自定义标签-扩展schema过程
阅读量:6629 次
发布时间:2019-06-25

本文共 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,用于解析我们自定义名字空间下的所有元素。里面包含了三个方法。

  1. init()会在NamespaceHandler初始化的时候被调用。

  2. BeanDefinition parse(Element, ParserContext) - 当Spring遇到一个顶层元素的时候被调用。

  3. 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/

你可能感兴趣的文章
centos 释放缓存
查看>>
opengl学习笔记——纹理贴图
查看>>
怎么在win7让WAMP下的apache自动启动
查看>>
WIN2008R2下安装plsqldeveloper和toad
查看>>
jquery 通过点击事件获取id
查看>>
ELK学习笔记b
查看>>
Linux无人值守自动化安装详细配置流程!
查看>>
jquery实现radio按钮在分组状态下点击选中,再次点击取消选中
查看>>
【51CTO学院三周年】我和51CTO学院的点滴
查看>>
hadoop2.4.1+hbase0.98.3实现的分布式网盘系统初步
查看>>
ibatis批量新增-自增长序列
查看>>
linux系统管理之九:rpm安装包
查看>>
Linux系统中查看日志的常用命令
查看>>
java基础(二) 自增自减与贪心规则
查看>>
VMWare View的组件
查看>>
Oracle GoldenGate学习之--异构平台同步(Mysql到Oracle)
查看>>
Linux下date命令使用举例说明
查看>>
Centos6下SVN服务器(结合Apache)的搭建
查看>>
Reactor和Proactor模式
查看>>
实验:关于XPath中的13个轴
查看>>