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

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect