一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot之自定義Schema擴展方式

SpringBoot之自定義Schema擴展方式

2022-01-19 01:06G-羅 Java教程

這篇文章主要介紹了SpringBoot之自定義Schema擴展方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot 自定義Schema擴展

最近在寫RPC框架時,用到了自定義的xsd配置。我們平時習慣于使用bean配置實例化對象,因此把xsd這種方式單獨拎出來。

1. 配置ServiceConfig屬性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Data
public class ServiceConfig {
    /** 接口 */
    private String interfaceClass;
 
    /** 引用 */
    private String ref;
 
    /** 版本 */
    private String version;
 
    @Override
    public String toString() {
        return "ServiceConfig{" +
                "interfaceClass='" + interfaceClass + '\'' +
                ", ref='" + ref + '\'' +
                ", version='" + version + '\'' +
                '}';
    }
}

2. 編寫XSD文件

配置element的name為service,配置的attribute對應ServiceConfig定義的屬性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://gitee.com/schema/link"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:beans="http://www.springframework.org/schema/beans"
                targetNamespace="http://gitee.com/schema/link"
                elementFormDefault="qualified">
    <xsd:import namespace="http://www.springframework.org/schema/beans" />
    <xsd:import namespace="http://www.springframework.org/schema/tool" />
 
    <xsd:element name="service">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="ref" type="xsd:string" use="required">
                        <xsd:annotation>
                            <xsd:documentation><![CDATA[ 服務接口實現類]]></xsd:documentation>
                        </xsd:annotation>
                    </xsd:attribute>
                    <xsd:attribute name="interfaceClass" type="xsd:string" use="required">
                        <xsd:annotation>
                            <xsd:documentation><![CDATA[服務接口]]></xsd:documentation>
                        </xsd:annotation>
                    </xsd:attribute>
                    <xsd:attribute name="version" type="xsd:string" />
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

3. 編寫NamespaceHandler

registerBeanDefinitionParser方法的key是xsd配置的element的name,表示service元素由LinkServiceBeanDefinitionParser對象解析

?
1
2
3
4
5
6
public class LinkNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        this.registerBeanDefinitionParser("service", new LinkServiceBeanDefinitionParser());
    }
}

4. 編寫BeanDefinitionParser

從element中解析出屬性,注冊到BeanDefinitionBuilder

?
1
2
3
4
5
6
7
8
9
10
11
12
public class LinkServiceBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
    @Override
    protected Class getBeanClass(Element element) {
        return ServiceConfig.class;
    }
    @Override
    protected void doParse(Element element, BeanDefinitionBuilder bean) {
        bean.addPropertyValue("ref", element.getAttribute("ref"));
        bean.addPropertyValue("interfaceClass", element.getAttribute("interfaceClass"));
        bean.addPropertyValue("version", element.getAttribute("version"));
    }
}

5. 配置spring.handlers和spring.schemas

?
1
2
http\://gitee.com/schema/link=com.test.xsd.handler.LinkNamespaceHandler
http\://gitee.com/schema/link/link.xsd=META-INF/link.xsd

6. 配置spring的加載文件

在文件頭部需要引入link的schema

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:link="http://gitee.com/schema/link"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://gitee.com/schema/link http://gitee.com/schema/link/link.xsd">
 
    <!-- rpc服務 -->
    <link:service id="serviceConfig"
                  ref="helloService"
                  interfaceClass="com.test.service.HelloService"
                  version="1.0.0"/>
</beans>

7. 測試

?
1
2
3
4
5
6
7
public class App {
 public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("link-server.xml");
  ServiceConfig config = (ServiceConfig) context.getBean("serviceConfig");
  System.out.println(config.toString());
 }
}

Spring Schema擴展機制

1. 概述

Spring2.0開始,Spring提供XML Schema可擴展機制,用戶可以自定義XML Schema文件,并自定義

XML Bean解析器,集成到Spring IOC容器中。

2. 步驟

創建一個XML Schema文件,描述自定義的合法構建模塊,也就是xsd文件。

自定義處理器類,并實現NamespaceHandler接口。

自定義一個或者多個解析器,實現BeanDefinitionParser接口(關鍵部分)。

注冊上面的組建到Spring IOC容器。

3. 示例如下

(1) 自定義XML Schema文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>?
<xsd:schema xmlns="http://www.liuenyuan.com/schema/myns"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:beans="http://www.springframework.org/schema/beans"
            targetNamespace="http://www.liuenyuan.com/schema/myns"
            elementFormDefault="qualified">
    <xsd:import namespace="http://www.springframework.org/schema/beans"/>
?
    <xsd:element name="dateFormat">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="pattern" type="xsd:string" use="required"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

自定義targetNamespace是http://www.liuenyuan.com/schema/myns,xmlns與命名空間必須一致。

(2) 自定義NamespaceHandler

NamespaceHandler接口只有三個方法

  • init():在NamespaceHandler被使用之前調用,完成初始化
  • parse():解析元素
  • decorate():嵌套元素時候調用

Spring提供一個默認實現類NamespaceHandlerSupport,注入每個元素的解析器即可。

用到了代理委托概念。NamespaceHandlerSupport可以注冊任意個BeanDefinitionParser,負責所有自定義元素編排,實際XML解析工作委托給各個BeanDefinitioParser負責。

(3) 自定義BeanDefinitionParser

BeanDefinitionParser 將被調用,如果NamespapceHandler遇到元素類型已經有對應注冊的parser(例如上面的handler如果遇到dateformat,DateformatDefinitionParser會被調用,

解析相應的屬性設置到Bean中)將會被調用。BeanDefinitionParser負責解析一個頂級元素。

Spring提供AbstractSingleBeanDefinitionParser處理繁重的解析工作。

  • getBeanClass():返回元素Class類型
  • doParse():添加元素屬性或者構造參數

(4) 注冊handler和schema

把實現的NamespaceHandler和xsd文件配置到指定的配置文件中。位于META-INF目錄中。

spring.handlers文件包含xml schema uri和Handler類映射關系。

?
1
2
http\://www.liuenyuan.com/schema/myns=\
  com.ley.springboot.schema.xml.MynsNamespaceHandler

遇到http\://www.liuenyuan.com/schema/myns命名空間的時候會交給MynsNamespaceHandler來處理,key部分必須和xsd文件中的targetNamespace值保持一致

spring.schemas文件包含xml schema xsd文件命名空間和文件路徑映射關系。

?
1
http\://www.liuenyuan.com/schema/myns.xsd=META-INF/myns.xsd

(5) 測試

NamespaceHandler實現類

?
1
2
3
4
5
6
public class MynsNamespaceHandler extends NamespaceHandlerSupport {?
    @Override
    public void init() {
        registerBeanDefinitionParser("dateFormat", new MynsBeanDefinitionParser());
    }
}

BeaDefinitionParser實現類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;?
import java.text.SimpleDateFormat;?
public class MynsBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {?
    @Override
    protected Class<?> getBeanClass(Element element) {
        return SimpleDateFormat.class;
    }
?
    @Override
    protected void doParse(Element element, BeanDefinitionBuilder builder) {
        String pattern = element.getAttribute("pattern");
        builder.addConstructorArgValue(pattern);
    }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/ghaohao/article/details/81116761

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 麻豆天美精东果冻传媒在线 | 久久这里只有精品视频9 | a级毛片毛片免费很很综合 a级黄色视屏 | 手机看片国产自拍 | 亚洲国产在线午夜视频无 | 九9热这里只有真品 | 亚洲国产精品嫩草影院久久 | 日b视频免费看 | 精品国产福利片在线观看 | 免费特黄一级欧美大片在线看 | 亚洲精品免费在线观看 | 成版人快猫永久破解版 | 天美传媒在线视频 | 欧美在线视频 一区二区 | 好湿好滑好硬好爽好深视频 | 精品欧美日韩一区二区三区 | 欧美日韩高清不卡一区二区三区 | 欧美性高清另类videosex死尸 | 青青青手机视频在线观看 | 国产成人愉拍免费视频 | 成人免费一区二区三区在线观看 | 亚洲人成网站在线观看妞妞网 | 欧美一级xxxx俄罗斯一级 | 国产xx肥老妇视频奂费 | 小SAO货叫大声点妓女 | 国产成人精品一区二区 | 精品无码乱码AV | 国内精品91最新在线观看 | 脱了白丝校花的内裤猛烈进入 | 免费网站看v片在线成人国产系列 | 性鸥美 | 91成人爽a毛片一区二区 | 午夜免费啪视频观看视频 | 吉川爱美与黑人解禁 | 国产日本韩国不卡在线视频 | 亚洲精品综合网 | 四虎影视永久在线观看 | 魔兽官方小说 | 精品久久久久免费极品大片 | 火影小南被爆羞羞网站 | 成人午夜毛片 |