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

这篇具有很好参考价值的文章主要介绍了Spring 自定义命名空间并解析 NameSpaceHandler。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring 自定义命名空间解析器

1.主要步骤

主要有以下四步:

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

2.代码实现

Spring 自定义命名空间并解析 NameSpaceHandler,spring,数据库,java

需要注意的时,把 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

Spring 自定义命名空间并解析 NameSpaceHandler,spring,数据库,java

自定义 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

Spring 自定义命名空间并解析 NameSpaceHandler,spring,数据库,java

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文章来源地址https://www.toymoban.com/news/detail-654770.html

到了这里,关于Spring 自定义命名空间并解析 NameSpaceHandler的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity的C#学习——命名空间的定义与访问、using语句的常见用法

    在C#中,命名空间(Namespace)是一种 将类和其他相关类型组织在一起的方式 。可以将命名空间看作是一个容器,用于管理和组织类和其他类型。通过将相关的类型组织在一起,可以使代码更加清晰和易于维护。 命名空间的主要目的是为了避免名称冲突,使得开发人员可以 使

    2024年02月11日
    浏览(55)
  • C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析

    方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。 创建一个方法 方法的定义以方法的名称开头,后跟括号()。C#提供了一些预定义的

    2024年01月24日
    浏览(59)
  • Spring自定义参数解析器~

    @RequstBody、@RequstParam 这些注解是不是很熟悉? 我们在开发 Controller 接口时经常会用到此类参数注解,那这些注解的作用是什么?我们真的了解吗? 简单来说,这些注解就是帮我们将前端传递的参数直接解析成直接可以在代码逻辑中使用的 javaBean,例如 @RequstBody 接收 json 参数

    2023年04月18日
    浏览(36)
  • Spring自定义参数解析器设计

    作者:京东零售 王鹏超 @RequstBody、@RequstParam 这些注解是不是很熟悉? 我们在开发Controller接口时经常会用到此类参数注解,那这些注解的作用是什么?我们真的了解吗? 简单来说,这些注解就是帮我们将前端传递的参数直接解析成直接可以在代码逻辑中使用的javaBean,例如

    2023年04月14日
    浏览(33)
  • vs2022 命名空间“System”中不存在类型或命名空间名“Printing”

    在监控打印机状态的时候,需要用到System.Printing。 System.Printing 命名空间 | Microsoft Learn 在微软官网有这个命名空间,其中提到 不支持命名空间中的System.Printing类在Windows服务或 ASP.NET 应用程序或服务中使用。 尝试从其中一种应用程序类型内使用这些类可能会导致意外问题,例

    2024年02月05日
    浏览(37)
  • [Unity命名空间教程]介绍Unity新自带的命名空间UnityEngine.Pool

      大家都知道在一些游戏中常常要创建大量的游戏对象,如果这些对象长期占用一些内存而没有触发垃圾回收机制(以下简称GC)或者过于频繁的触发GC就会导致游戏的帧数暴跌,在移动设备直接造成卡死的现象,那引用对象池的概念,能让这些游戏对象在刚开始的时候就被初

    2023年04月11日
    浏览(47)
  • 命名空间“Microsoft”中不存在类型或命名空间名“office”(是否缺少程序集引用?)

    生成软件的时候提示office报错 项目-引用-右击添加引用-选择如下图-点击确定 选择后点击重新生成即可生成成功! 如果是之前就有添加,然后再打开这个软件显示office报错,就将之前引用的删除,重新添加引用 。

    2024年02月11日
    浏览(48)
  • 【C++】namespace 命名空间

    两个术语: 声明区域:声明区域是可以在其中进行声明的区域。 潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。 名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代

    2023年04月08日
    浏览(40)
  • Linux命名空间简述

    目录 一、命名空间简介 二、命名空间分类 三、如何创建命名空间 四、Linux可以自动为系统服务创建独立的命名空间 在传统的LIinux系统上,系统资源都是全局的,比如pid、文件、网络等,为了支持容器虚拟化,Linux内核有NameSpace机制,它可以把一组进程的资源隔离起来,比如

    2024年02月07日
    浏览(44)
  • C++ :命名空间域

    目录 冲突与命名: 举个例子: 全局与局部: 域作用限定符:  命名空间域: 命名空间域的使用方式:  加命名空间名称及作用域限定符 使用using将命名空间中某个成员引入 使用using namespace 命名空间名称 引入  嵌套使用 在C语言中,我们通常会使用stdlib.h  而stdlib.h 本质上

    2024年01月22日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包