Spring下自定义xml标签

2024-09-08 09:58
文章标签 java xml 自定义 spring 标签

本文主要是介绍Spring下自定义xml标签,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子。

一 编写模型类

复制代码
 1 package com.hulk.testdubbo.model;2 3 public class Hero {4     private  String name;5     private  int    age;6 7     public String getName() {8         return name;9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14 
15     public int getAge() {
16         return age;
17     }
18 
19     public void setAge(int age) {
20         this.age = age;
21     }
22 }
复制代码

 

二 定义xsd文件

复制代码
 1 <xsd:schema2         xmlns="http://hulk.com/schema"3         xmlns:xsd="http://www.w3.org/2001/XMLSchema"4         targetNamespace="http://hulk.com/schema">5     <xsd:complexType name="elementname1complexType">6         <xsd:attribute name="name" type="xsd:string">7             <xsd:annotation>8                 <xsd:documentation><![CDATA[ The elementname1 name. ]]></xsd:documentation>9             </xsd:annotation>
10         </xsd:attribute>
11         <xsd:attribute name="age" type="xsd:int">
12             <xsd:annotation>
13                 <xsd:documentation><![CDATA[ The elementname1 age. ]]></xsd:documentation>
14             </xsd:annotation>
15         </xsd:attribute>
16     </xsd:complexType>
17 
18     <xsd:element name="elementname1" type="elementname1complexType">
19         <xsd:annotation>
20             <xsd:documentation><![CDATA[ elementname1的文档 ]]></xsd:documentation>
21         </xsd:annotation>
22     </xsd:element>
23 </xsd:schema>
复制代码

说明:

  • 定义targetNamespace(目标命名空间),xmlns的值要与这个相同
  • xsd:element定义的就是将来会在xml文件中用到的元素,例如<dubbo:application>中的application
  • xsd:attribute定义的就是模型类中的属性,例如<dubbo:application name=”xxx”>中的name,并且可以指定属性类型,进而起到检测的作用(当我们定义的是int,如果在xml中的值是非int型的,直接会报错)。

 

三 编写spring.schemas

作用:该文件用来指定xsd文件的位置。

http\://hulk.com/schema/hero.xsd=META-INF/hero.xsd

注意:红色部分要与xsd文件中的targetNamespace相同。

 

四 编写BeanDefinition解析器

作用:主要用来解析自定义的xml标签。

复制代码
 1 package com.hulk.testdubbo.schema;2 3 import org.springframework.beans.factory.config.BeanDefinition;4 import org.springframework.beans.factory.support.BeanDefinitionRegistry;5 import org.springframework.beans.factory.support.RootBeanDefinition;6 import org.springframework.beans.factory.xml.BeanDefinitionParser;7 import org.springframework.beans.factory.xml.ParserContext;8 import org.w3c.dom.Element;9 
10 public class HeroBeanDefinitionParser implements BeanDefinitionParser {
11     private final Class<?> beanClass;
12 
13     public HeroBeanDefinitionParser(Class<?> beanClass) {
14         this.beanClass = beanClass;
15     }
16 
17     public BeanDefinition parse(Element element, ParserContext parserContext) {
18         RootBeanDefinition beanDefinition = new RootBeanDefinition();
19         beanDefinition.setBeanClass(beanClass);
20         beanDefinition.setLazyInit(false);
21         beanDefinition.getPropertyValues().add("name", element.getAttribute("name"));
22         beanDefinition.getPropertyValues().add("age", element.getAttribute("age"));
23         BeanDefinitionRegistry beanDefinitionRegistry = parserContext.getRegistry();
24         beanDefinitionRegistry.registerBeanDefinition(beanClass.getName(),beanDefinition);//注册bean到BeanDefinitionRegistry中
25         return beanDefinition;
26     }
27 }
复制代码

 

五 编写命名空间处理器

作用:主要用来注册BeanDefinition解析器。

复制代码
 1 package com.hulk.testdubbo.schema;2 3 import com.hulk.testdubbo.model.Hero;4 import org.springframework.beans.factory.xml.NamespaceHandlerSupport;5 6 public class HeroNamespaceHandler extends NamespaceHandlerSupport {7     public void init() {8         registerBeanDefinitionParser("elementname1", new HeroBeanDefinitionParser(Hero.class));9     }
10 }
复制代码

说明:通常为每一个xsd:element都要注册一个BeanDefinitionParser。

 

六 编写spring.handlers文件

作用:主要用于关联命名空间处理器和xsd中的targetNamespace。

http\://hulk.com/schema=com.hulk.testdubbo.schema.HeroNamespaceHandler

说明:key是xsd文件中的targetNamespace。

 

七 测试 - 编写hero.xml

复制代码
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4        xmlns:hero="http://hulk.com/schema"
5        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
6        http://hulk.com/schema http://hulk.com/schema/hero.xsd">
7     <hero:elementname1 name="xiaona" age="18"/>
8 </beans>
复制代码

说明:

  • xmlns:hero的value是xsd文件中的targetNamespace。
  • xmlns:hero可以写成xmlns:xxx,此时<hero:elementname1/>就要写成<xxx:elementname1/>

 

八 测试 - 编写测试主类

复制代码
 1 package com.hulk.testdubbo.test;2 3 import com.hulk.testdubbo.model.Hero;4 import org.springframework.context.ApplicationContext;5 import org.springframework.context.support.ClassPathXmlApplicationContext;6 7 public class Main {8     public static void main(String[] args) {9         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("hero.xml");
10         Hero hero = (Hero) applicationContext.getBean(Hero.class.getName());
11         System.out.println("name: " + hero.getName() + " age: " + hero.getAge());
12     }
13 }
复制代码

 

如何在spring中自定义xml标签的方法就结束了。在实际中,随着注解和javaconfg的盛行,xml的方式渐渐的会淡出舞台,但是spring的启动流程还是会的。来看一下上述代码涉及到的流程。

  • 使用ResourceLoader将配置文件xml装载为Resource对象;
  • 使用BeanDefinitionReader解析配置信息:将每一个<bean>解析为一个BeanDefinition对象,然后存储到BeanDefinitionRegistry中
    • 实际上是BeanDefinitionReader调用BeanDefinitionParser进行了解析操作,解析完成后注册到BeanDefinitionRegistry(代码看上边的HeroBeanDefinitionParser)

这篇关于Spring下自定义xml标签的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147801

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有