Spring 自定义命名空间并解析 NameSpaceHandler

Spring 自定义命名空间解析器

1.主要步骤

主要有以下四步:

  1. 编写Schema文件
  2. 自定义NameSpaceHandler 绑定命令空间
  3. 自定义 BeanDefinitionParse 解析XML作为bd的配置元信息
  4. 命名空间映射XML

2.代码实现

image-20230817220449373

需要注意的时,把 spring.handlers 文件与 spring.schemas 放在 resource目录下的META-INF文件中

Schema文件 myschema.xsd 放在任意位置均可,但后面命名空间映射XML的时候,路径不要写错

编写Schema文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?><xsd:schema xmlns="http://www.myschema.org/myschema"xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.myschema.org/myschema"><xsd:import namespace="http://www.w3.org/XML/1998/namespace"/><xsd:complexType name="My"><xsd:attribute name="id" type="xsd:long" use="required"/><xsd:attribute name="name" type="xsd:string" use="required"/><xsd:attribute name="gender" type="gender"/></xsd:complexType><xsd:simpleType name="gender"><xsd:restriction base="xsd:string"><xsd:enumeration value="MAN"/><xsd:enumeration value="WOMAN"/></xsd:restriction></xsd:simpleType><xsd:element name="my" type="My"/></xsd:schema>

自定义命名空间处理器 绑定命令空间

package com.sz.myschema.factory.xml;import org.springframework.beans.factory.xml.NamespaceHandlerSupport;public class MyScheamNameSpaceHolder extends NamespaceHandlerSupport {@Overridepublic void init() {this.registerBeanDefinitionParser("my",new MySchemaParse());}}

spring.handlers

http\://www.myschema.org/myschema=com.sz.myschema.factory.xml.MyScheamNameSpaceHolder

image-20230817220745656

自定义 BeanDefinitionParse 解析XML

package com.sz.myschema.factory.xml;import com.sz.myschema.factory.bean.My;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;public class MySchemaParse extends AbstractSimpleBeanDefinitionParser {@Overrideprotected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {setPropertyValue("id",element,builder);setPropertyValue("name",element,builder);setPropertyValue("gender",element,builder);}public void setPropertyValue(String id,Element element,BeanDefinitionBuilder builder){builder.addPropertyValue(id,element.getAttribute(id));}@Overrideprotected Class<?> getBeanClass(Element element) {return My.class;}
}

命名空间映射XML

spring.schemas

http\://www.myschema.org/myschema.xsd=META-INF/myschema.xsd

image-20230817220725123

3.测试

spring.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:myschema="http://www.myschema.org/myschema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.myschema.org/myschemahttp://www.myschema.org/myschema.xsd"><myschema:my id="18" name="zhangsan" gender="MAN"/></beans>

测试类

package com.sz.myschema;import com.sz.myschema.factory.bean.My;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;public class App {public static void main(String[] args) {DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);xmlBeanDefinitionReader.loadBeanDefinitions("classpath:spring-config.xml");My bean = defaultListableBeanFactory.getBean(My.class);System.out.println("bean = " + bean);}}

输出结果

bean = My{id=18, name='zhangsan', gender='MAN'}

完整代码 :https://gitcode.net/JAVAlife2021/spring.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/71141.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案WORD

导读&#xff1a;原文《18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 第一章 项目概述 1.1项目…

驱动 day4

通过字符设备驱动分步注册方式编写LED灯的驱动&#xff0c;应用程序使用ioctl函数编写硬件控制 mycdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #inc…

【JAVA】数组练习

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 数组练习 1. 数组转字符串2. 数组拷贝3.…

mysql 数据备份和恢复

操作系统&#xff1a;22.04.1-Ubuntu mysql 版本&#xff1a;8.033 binlog 介绍 binlog 是mysql 二进制日志 binary log的简称&#xff0c;可以简单理解为数据的修改记录。 需要开启binlog,才会产生文件&#xff0c;mysql 8.0 默认开启,开启后可以在 /var/lib/mysql &#xff…

Vim在Mac电脑中的下载与安装方法:MacVim

本文介绍在Mac系统电脑中&#xff0c;下载、安装文本编辑器Vim软件&#xff08;MacVim软件&#xff09;的具体方法。 在Mac系统电脑中&#xff0c;原本就带有一个非图形界面的Vim&#xff1b;只要我们在终端中&#xff0c;输入如下的代码&#xff0c;就可以查看系统自带的非图形…

JetPack Compose 学习笔记(持续整理中...)

1.为什么要学&#xff1f; 1.命令式和声明式 UI大战,个人认为命令式UI自定义程度较高,能更深入到性能,内存优化方面,而申明式UI 是现在主流的设计,比如React,React Native,Flutter,Swift UI等等,现在性能也逐渐在变得更好 2.还有一个原因compose 是KMM 是完整跨平台的UI基础 3.…

汇川脉冲伺服SV630P常用参数设置(博途PLC脉冲输出控制)

有关博途PLC脉冲输出控制功能块详细介绍,请查看下面博客链接: 博途1200PLC轴控功能块(脉冲轴)_博图 轴控块_RXXW_Dor的博客-CSDN博客STRUCT// 轴使能// 轴正向点动// 轴反向点动// 轴回原// 轴复位// 轴暂停// 轴快速停机// 轴绝对定位// 轴相对定位// 轴匀速运行// 修改轴参…

repmgr出现双主,并且时间线分叉,删除了最新的时间线节点

遇到的问题如下&#xff1a; 2023-08-17 20:24:21.566 CST [1556001] LOG: database system was interrupted; last known up at 2023-08-17 20:21:41 CST 2023-08-17 20:24:21.770 CST [1556001] LOG: restored log file "00000009.history" from archive cp: 无法…

freeswitch的mod_xml_curl模块动态获取configuration

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 mod_xml_curl模块支持从web服务获取xml配置&#xff0c;本文介绍如何动态获取acl配置。 环境 centos&#xff1a;CentOS release 7.0 (Final)或以上版本 freeswitch&#xff1a;v1.6.20 GCC&#xff1a;4.8.5 web…

Tomcat+Http+Servlet

文章目录 1.HTTP1.1 请求和响应HTTP请求&#xff1a;请求行请求头请求体HTTP响应&#xff1a;响应行&#xff08;状态行&#xff09;响应头响应体 2. Apache Tomcat2.1 基本使用2.2 IDEA中创建 Maven Web项目2.3 IDEA中使用Tomcat 3. Servlet3.1 Servlet快速入门3.2 Servlet执行…

PHP手术麻醉系统源码,自动生成麻醉和护理医疗文书

一套手术麻醉系统源码&#xff0c;可二次开发 手术室麻醉临床信息系统&#xff08;AIMS&#xff09;是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&#xff0…

微型导轨怎么保养?

微型导轨一般都是用在一些小型的设备上面的&#xff0c;虽说微型导轨的尺寸非常小&#xff0c;但精度可一点都不低呢&#xff01;一般具体用在一些机械的取放臂上面&#xff0c;作为精密测量和检测&#xff0c;效果还是不错的。 微型导轨属于精密传动零件&#xff0c;我们在使用…