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

news2024/11/23 10:26:27

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 {

    @Override
    public 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 {

    @Override
    protected 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));
    }

    @Override
    protected 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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.myschema.org/myschema
        http://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.coloradmin.cn/o/891390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测&#xff0c;运行环境Matlab2023b及以上…

实例039 始终在最上面的窗体

实例说明 Windows桌面上允许多个窗体同时显示&#xff0c;但是只有一个窗体能够得到焦点&#xff0c;当一个窗体得到焦点后在其上面的窗体会被得到焦点的窗体遮挡&#xff0c;得到焦点的窗体会显示在最上层&#xff0c;这样被覆盖的窗体就不能完全的显示给用户&#xff0c;如果…

Resolver error: Error: Connecting with SSH timed out

别忘了配置部门内部ip&#xff0c;才能访问服务器 windows卸载重装openssh 参考链接&#xff1a;安装 OpenSSH | Microsoft Learn

PHP自己的框架实现config配置层级存取(完善篇二)

1、实现效果 config(include_once $coreConfig); //加载配置文件config() //获取所有配置 config(DB_HOST) 获取配置 2、按层级配置文件加载&#xff0c;存取配置项 config,function.php function config($varNULL,$valueNULL){static $configarray();if(is_array($var)){…

阻塞IO、非阻塞IO和IO多路复用

文章目录 用户态和内核态操作系统角度的IOIO模型阻塞IO非阻塞IO&#xff08;NIO&#xff09;IO多路复用select 、poll和epoll 用户态和内核态 用户态也叫用户空间&#xff0c;内核态也叫内核空间。 操作系统为了保护系统的安全&#xff0c;都会划分出内核空间和用户空间。简单…

seata 的部署和集成

文章目录 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 TODO三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos…

PHP加密与安全的最佳实践

PHP加密与安全的最佳实践 概述 在当今信息时代&#xff0c;数据安全是非常重要的。对于开发人员而言&#xff0c;掌握加密和安全的最佳实践是必不可少的。PHP作为一种常用的后端开发语言&#xff0c;提供了许多功能强大且易于使用的加密和安全性相关函数和类。本文将介绍一些P…

vue动态修改audio地址

问题&#xff1a;点击后替换url地址&#xff0c;实现了&#xff0c;但是播放器依旧没有反应。 解决&#xff1a;vue中动态替换只是替换了地址&#xff0c;并没有告诉audio标签是否要执行&#xff0c;执行什么操作。要load后才能让它知道&#xff0c;是在喊他&#xff0c;他需求…

geacon_pro配合catcs4.5上线Mac、Linux

我的个人博客: xzajyjs.cn 一些链接 Try师傅的catcs4.5项目: https://github.com/TryGOTry/CobaltStrike_Cat_4.5&#xff0c;最新版解压密码见&#xff1a;https://www.nctry.com/2708.html geacon_pro: https://github.com/testxxxzzz/geacon_pro BeaconTool.jar: https:/…

工业用故障电弧探测器的设计与应用

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 故障电弧产生的原因---绝缘破损 原因二&#xff1a;线路绝缘破损&#xff0c;导致相间并联故障电弧及对地故障电弧 (1)电气线路施工时未按规范使用套管等保护措施&#xff1b; (2)野蛮施工等施工不当导致线路绝缘皮破损&#xff1b; …

基于web的人力资源管理系统/基于java的OA系统

摘 要 人力资源管理系统是现代企业的核心内容。随着计算机信息技术的高速发展电子商务模式的空前盛行&#xff0c;企业之间的竞争也从有形的经济市场转向了网络。开发以计算机技术、网络技术、信息技术支持的现代人力资源管理系统&#xff0c;既能提高人力资源管理的技术含量和…

云上社群学习系统部分接口设计详解与测试

目录 一、项目简介 1. 使用统一返回格式&#xff0b;全局错误信息定义处理前后端交互时的返回结果 2&#xff0e;使用ControllerAdviceExceptionHandler实现全局异常处理 3&#xff0e;使用拦截器实现用户登录校验 4. 使用MybatisGeneratorConfig生成常的增删改查方法 5. …

.net core发布到IIS上出现 HTTP 错误 500.19

1.检查.net core 环境运行环境是否安装完成&#xff0c;类似如下环境 2.IIS是否安装全 本次原因就是IIS未安装全导致的 按照网上说的手动重启iis&#xff08;iisreset&#xff09;也不行

无涯教程-Perl - telldir函数

描述 此函数返回DIRHANDLE引用的目录列表中读指针的当前位置。此返回值可以由seekdir()函数使用。 语法 以下是此函数的简单语法- telldir DIRHANDLE返回值 此函数返回目录中的当前位置。 例 以下是显示其基本用法的示例代码,/tmp目录中只有两个文件- #!/usr/bin/perl …

Vue用JSEncrypt对长文本json加密以及发现解密失败

哈喽 大家好啊&#xff0c;最近发现进行加密后 超长文本后端解密失败&#xff0c;经过看其他博主修改 JSEncrypt原生代码如下&#xff1a; // 分段加密&#xff0c;支持中文JSEncrypt.prototype.encryptUnicodeLong function (string) {var k this.getKey();//根据key所能编…

由小波变换模极大值重建信号

给定信号&#xff0c; 令小波变换的尺度 则x(t)的二进小波变换为 令为取模极大值时的横坐标&#xff0c;那么就是模极大值。 目标是由坐标、模极大值及最后一级的低频分量重建信号x(t) 为了重建x(t)&#xff0c;假定有一信号集合h(t)&#xff0c;该集合中信号的小波变换和x(…

JavaScript请求数据的4种方法总结(Ajax、fetch、jQuery、axios)

JavaScript请求数据有4种主流方式&#xff0c;分别是Ajax、fetch、jQuery和axios。 一、Ajax、fetch、jQuery和axios的详细解释&#xff1a; 1、 Ajax Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种使用JavaScript在用户的浏览器上发送请求的技术&…

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 2.代码说明&#xff1a;要求于Matlab 2021版及以上版本。 程序…

kernel的config加上 CONFIG_SND_ALOOP=y ,aplay不能播放声音

概念&#xff1a;CONFIG_SND_ALOOP CONFIG_SND_ALOOP 是 Linux 内核配置选项之一&#xff0c;用于启用 ALSA Loopback 驱动程序。 ALSA&#xff08;Advanced Linux Sound Architecture&#xff09;是 Linux 上的音频架构&#xff0c;提供了一个统一的音频接口&#xff0c;使应…

雷军写的代码上热搜了

“雷军写的代码”一词突然上了微博热搜&#xff1a; 一瞬间&#xff0c;我想起了这张图&#xff1a; 到底发生了什么&#xff0c;好奇的我点进去一看&#xff0c;原来是因为雷军预告年度演讲的微博里配了一张海报&#xff1a; 这张海报信息量非常大&#xff0c;一眼就能看到有很…