iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring XML Schema扩展机制怎么用
  • 680
分享到

Spring XML Schema扩展机制怎么用

2023-06-15 07:06:39 680人浏览 八月长安
摘要

这篇文章主要介绍spring XML Schema扩展机制怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和

这篇文章主要介绍spring XML Schema扩展机制怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

前言

在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的mybatisdubbo等,以及内部封装的各类组件包括RedisMQ、配置中心等。

有了整合这一步,我们只需引入相应的jar,比如mybatis-spring,然后进行简单的配置后即可在Spring工程中使用Mybatis的功能,也正是由于这样的便捷性,导致很多时候我们没有对其进行深究。

XML Schema扩展

打开mybatis-spring、dubbo的源码会发现在META-INF目录下有两个文件(如下图所示),spring.handlers与spring.schemas,这两个文件就是XML Schema扩展的关键入口点。

Spring XML Schema扩展机制怎么用

XSD

XSD,XML Schema Definition,XML定义。

XML Schema定义XML文档的结构,XML Schema语言也称为XML定义,即XSD。

简单的说,XSD用于制定xml文件规范,包括xml中的元素(简单元素、复杂元素)、属性、以及属性类型及约束等。

Spring XML Schema扩展的第一步就是要定义一个xsd文件,比如spring-beans对应xsd文件为Http://www.springframework.org/schema/beans/spring-beans.xsd,如下图:

Spring XML Schema扩展机制怎么用

Spring XML Schema扩展机制怎么用

为了简单介绍Spring XML Schema扩展实现,下面将一个简单例子(模拟一个简单的分布式id生成器,不会实现具体功能)进行说明,xsd定义如下(文件命名为DistributedId.xsd,在META-INF目录下):

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns="http://www.hexup.com/schema/distributed-id"            xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.hexup.com/schema/distributed-id">    <xsd:element name="distributed-id">        <xsd:complexType>            <xsd:attribute name="id" type="xsd:string"></xsd:attribute>            <xsd:attribute name="bizCode" type="xsd:string"></xsd:attribute>            <xsd:attribute name="length" type="xsd:int"></xsd:attribute>        </xsd:complexType>    </xsd:element>            </xsd:schema>

上述xsd文件里定义了一个复杂元素distributed-id,包含属性id,bizCode,length,形如:

<distributed-id id="xxx" bizCode="xxx" length="xxx"></distributed-id>

注意:xmlns,即为xml namespace,xml命名空间,后面跟的http链接地址可以不存在,因为xsd会放在当前工程的META-INF下。

配置spring.handlers和spring.schemas

如下两张图所示,spring.schemas文件中用于说明xsd的文件路径,spring.schemas文件用于说明解析此类xsd定义的标签的处理类,下面会对处理类进行详细说明。

Spring XML Schema扩展机制怎么用

NameSpaceHandler与BeanDefinitionParser

定义类DistributedIdNamespaceHandler继承NamespaceHandlerSupport,init方法用于注册BeanDefinition解析器,也就是解析xml中对应标签为Spring Bean。

public class DistributedIdNamespaceHandler extends NamespaceHandlerSupport {    @Override    public void init() {        reGISterBeanDefinitionParser("distributed-id", new DistributedIdParser());    }}

同时要创建BeanDefinitionParser

public class DistributedIdParser implements BeanDefinitionParser {    @Override    public BeanDefinition parse(Element element, ParserContext parserContext) {        // 解析xml内的标签        String bizCode = element.getAttribute("bizCode");        int length = Integer.valueOf(element.getAttribute("length"));        String id = element.getAttribute("id");                // 创建DistributedIdFactoryBean bean        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();        builder.getRawBeanDefinition().setBeanClass(DistributedIdFactoryBean.class);        builder.setScope(BeanDefinition.SCOPE_SINGLETON);        builder.addPropertyValue("bizCode", bizCode);        builder.addPropertyValue("length", length);        BeanDefinition beanDefinition = builder.getBeanDefinition();        parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);        return beanDefinition;    }}

其中DistributedIdFactoryBean实现FactoryBean接口用于创建DistributedIdComponent Bean,如下

public class DistributedIdFactoryBean implements InitializingBean, FactoryBean<DistributedIdComponent> {    private String bizCode;    private int length;    private DistributedIdComponent distributedIdComponent;    @Override    public DistributedIdComponent getObject() throws Exception {        return distributedIdComponent;    }    @Override    public Class<?> getObjectType() {        return DistributedIdComponent.class;    }    @Override    public boolean isSingleton() {        return false;    }    @Override    public void afterPropertiesSet() throws Exception {        distributedIdComponent = new DistributedIdComponent(bizCode, length);    }    public void setBizCode(String bizCode) {        this.bizCode = bizCode;    }    public void setLength(int length) {        this.length = length;    }}

目标Bean DistributedIdComponent如下:

public class DistributedIdComponent {    private String bizCode;    private int length;    public DistributedIdComponent() {    }    public DistributedIdComponent(String bizCode, int length) {        this.bizCode = bizCode;        this.length = length;    }    public String generateId() {        System.out.println("mock generate id");        return String.valueOf(System.currentTimeMillis()).substring(0, length);    }    public String getBizCode() {        return bizCode;    }    public void setBizCode(String bizCode) {        this.bizCode = bizCode;    }    public int getLength() {        return length;    }    public void setLength(int length) {        this.length = length;    }}

使用

spring配置文件,spring-service.xml中配置distributed-id标签以及对应的属性值,如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:distributed-id="http://www.hexup.com/schema/distributed-id"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.hexup.com/schema/distributed-id http://www.hexup.com/schema/distributed-id.xsd">    <distributed-id:distributed-id id="test" bizCode="test" length="8"></distributed-id:distributed-id></beans>

运行容器验证:

public class App {    public static void main(String[] args) {        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-service.xml");        DistributedIdComponent bean = context.getBean(DistributedIdComponent.class);        String id = bean.generateId();        System.out.println("id:" + id);    }}

总结

本文主要介绍了Spring XML Schema扩展机制的使用方法,大致步骤为定义XSD文件、配置spring.schemas、编码实现NameSpaceHanlder和BeanDefinitionParser实现类、配置spring.handlers。但未说明具体的实现原理,后续会有一篇文章详细介绍Spring源码是怎么实现扩展的,以及介绍为什么使用FactoryBean来创建具体的Bean等问题。

以上是“Spring XML Schema扩展机制怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Spring XML Schema扩展机制怎么用

本文链接: https://www.lsjlt.com/news/278645.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring XML Schema扩展机制怎么用
    这篇文章主要介绍Spring XML Schema扩展机制怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和...
    99+
    2023-06-15
  • Spring XML Schema扩展机制的使用示例
    目录前言XML Schema扩展XSD配置spring.handlers和spring.schemasNameSpaceHandler与BeanDefinitionParser使用总...
    99+
    2024-04-02
  • Spring自定义XML schema 扩展的示例分析
    小编给大家分享一下Spring自定义XML schema 扩展的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring整合dubbo的事例<be...
    99+
    2023-06-15
  • 关于Spring自定义XML schema 扩展的问题(Spring面试高频题)
    引言 自从SpringBoot时代的到来,去除了Spring的各种繁琐的XML配置,让我们可以腾出双手以便于更加专注的搬砖。记得那时候刚学Spring的时候,每天被Spring的各种...
    99+
    2024-04-02
  • Spring是怎么扩展解析xml接口的
    目录自定义Spring配置BeanDefinitionParserDelegateDefaultNamespaceHandlerResolverNamespaceHandlerSup...
    99+
    2024-04-02
  • Spring的Xml和JavaConfig 扩展哪个好用
    引言 上一篇文章我们有怎么介绍到如何通过XML的形式来定义Spring的扩展《Spring面试高频题如何:自定义XML schema 扩展》,好多人都在吐槽现在都什么年代了,xml还...
    99+
    2024-04-02
  • Spring Cloud中怎么自定义外部化扩展机制
    这篇文章主要讲解了“Spring Cloud中怎么自定义外部化扩展机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Cloud中怎么自定义外部化扩展机制”吧...
    99+
    2023-06-29
  • PHP 函数库的扩展机制是什么?
    php 函数库扩展机制允许开发人员创建自定义函数,并将其添加到 php 内核,从而提供灵活性,适应广泛的用例。需要创建共享对象(.so 文件),编写 c 代码并编译为共享对象,注册扩展,...
    99+
    2024-04-10
    扩展机制 php 函数库 git
  • PostgreSQL数据库单机怎样扩展为流复制
    本篇文章为大家展示了PostgreSQL数据库单机怎样扩展为流复制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 在standby...
    99+
    2024-04-02
  • Eclipse扩展点怎么用
    小编给大家分享一下Eclipse扩展点怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Eclipse中提供了几个扩展点,方便扩展重构功能。基本的重构功能有,R...
    99+
    2023-06-17
  • Spring Cloud 中自定义外部化扩展机制原理及实战记录
    目录自定义PropertySource扩展PropertySourceLocatorSpring.factories编写controller测试阶段性总结SpringApplicat...
    99+
    2024-04-02
  • 如何使用Java扩展机制加载所有JAR包
    本篇文章为大家展示了如何使用Java扩展机制加载所有JAR包,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java 扩展机制在Java教程中被描述为一种“通过标准可扩展的方式来让Java平台上所有应...
    99+
    2023-06-17
  • 怎么使用Kotlin来扩展
    今天小编给大家分享一下怎么使用Kotlin来扩展的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实际上客户早在去年年初的时候便...
    99+
    2023-06-17
  • 怎么用Django定制和扩展后台管理界面
    在Django中定制和扩展后台管理界面可以通过以下方式实现: 使用自定义模型管理器:可以通过定义自定义模型管理器来扩展后台管理界...
    99+
    2024-04-02
  • 怎么使用PostgreSQL扩展函数
    这篇文章主要讲解了“怎么使用PostgreSQL扩展函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用PostgreSQL扩展函数”吧!例子.&nb...
    99+
    2024-04-02
  • 怎么使用Laravel World的扩展
    本篇内容介绍了“怎么使用Laravel  World的扩展”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Laravel World...
    99+
    2023-06-25
  • 怎么使用Zsh扩展集合
    这篇文章主要介绍了怎么使用Zsh扩展集合的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Zsh扩展集合文章都会有所收获,下面我们一起来看看吧。Zsh(Z-shell)是一款用于交互式使用的shell,也可...
    99+
    2023-06-27
  • MyBatis扩展插件怎么使用
    MyBatis扩展插件可以用来扩展MyBatis的功能,例如自定义类型处理器、拦截器、生成器等。使用MyBatis扩展插件的步骤如下...
    99+
    2024-03-07
    MyBatis
  • JavaScript扩展运算符怎么用
    小编给大家分享一下JavaScript扩展运算符怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!复制数组我们可以使用展开操作符复制数组,不过要注意的是这是一个...
    99+
    2023-06-14
  • 怎么理解List的扩容机制
    这篇文章主要讲解了“怎么理解List的扩容机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解List的扩容机制”吧!一:背景 讲故事在前一篇大内存排查中,我们看到了Dictionar...
    99+
    2023-06-01
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作