spring - 自定义标签-扩展schema过程

简介:


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默认的是找到这两个文件夹下的文件。请看这个文件下的是怎么编写的。

wKioL1l0FqeT0MhwAABL5Za6Nj8215.jpg-wh_50


完美,测试类,可以自己写一个获取spring配置文件的类来测试就可以了。




本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1950156

相关文章
|
前端开发 Java 开发者
Spring MVC:构建高效、可维护、可扩展的Web应用程序
Spring MVC:构建高效、可维护、可扩展的Web应用程序
106 0
|
JSON Java 数据格式
三万字盘点Spring/Boot的那些常用扩展点(下)
Spring对于每个Java后端程序员来说肯定不陌生,日常开发和面试必备的。本文就来盘点Spring/SpringBoot常见的扩展点,同时也来看看常见的开源框架是如何基于这些扩展点跟Spring/SpringBoot整合的。 话不多说,直接进入正题。
|
SQL Java 数据库
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(上)
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(上)
|
7月前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
161 5
|
安全 前端开发 Java
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(下)
Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(下)
|
监控 Java 应用服务中间件
Spring Boot应用的部署与扩展
Spring Boot应用的部署与扩展
|
Java Spring 容器
深入理解Spring源码之IOC 扩展原理BeanFactoryPostProcessor和事件监听ApplicationListener
深入理解Spring源码之IOC 扩展原理BeanFactoryPostProcessor和事件监听ApplicationListener
103 0
|
监控 Java 应用服务中间件
Spring Boot应用的部署与扩展
Spring Boot应用的部署与扩展
|
存储 Java Apache
整合Spring Boot和Pulsar实现可扩展的消息处理
整合Spring Boot和Pulsar实现可扩展的消息处理

热门文章

最新文章