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日
    浏览(43)
  • C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析

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

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

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

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

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

    2023年04月14日
    浏览(27)
  • [Unity命名空间教程]介绍Unity新自带的命名空间UnityEngine.Pool

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

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

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

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

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

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

    命名空间时怎么来的?它又是什么,让我们一起来看一下吧 首先了解:在同一个域中不能同时出现重名的变量或函数名等(不同域中可以尽管是全局与局部域) ok 我们来看 在工程项目里,一开始用 C语言 开发时,可能你在你的项目文件中给你的变量(或函数)取了一个好名

    2024年02月02日
    浏览(31)
  • 【C++ 记忆站】命名空间

    在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace的出现就是针对这种问题的。 很多人在开

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

    命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突; 命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效

    2024年02月04日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包