日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

缘起 Dubbo ,讲讲 Spring XML Schema 扩展机制

發布時間:2024/4/13 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 缘起 Dubbo ,讲讲 Spring XML Schema 扩展机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

在 Dubbo 中,可以使用 XML 配置相關信息,也可以用來引入服務或者導出服務。配置完成,啟動工程,Spring 會讀取配置文件,生成注入 相關 Bean。那 Dubbo 如何實現自定義 XML 被 Spring 加載讀取?

Spring XML Schema 擴展機制。從 Spring 2.0 開始,Spring 開始提供了一種基于 XML Schema 格式擴展機制,用于定義和配置 bean。

Spring XML Schema 擴展機制

實現 Spring XML Schema 擴展,其實非常簡單,只需要完成下面四步。

  • 創建 XML Schema 文件,由于該文件后綴名為 xsd,下面稱為 XSD 文件。
  • 編寫實現一個或多個 BeanDefinitionParser 。
  • 編寫NamespaceHandler實現類。
  • 注冊 NamespaceHandler 以及 XSD 文件。
  • 我們按照以上步驟,最終完整 Spring 解析如下配置。

    <?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:demo="http://www.test.com/demo"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.test.com/demo http://www.test.com/demo/demo.xsd"><demo:application name="test" id="test"/> </beans> 復制代碼

    創建 XSD 文件

    XSD 文件,主要用來定義 XML 格式,用來驗證 XML 合法性。在 IDE 中,導入 XSD 文件,編輯 XML 文件可以獲得相關提示。

    下面我們生成一個 XSD 文件。

    <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns="http://www.test.com/demo"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:beans="http://www.springframework.org/schema/beans"targetNamespace="http://www.test.com/demo"elementFormDefault="qualified"attributeFormDefault="unqualified"><xsd:import namespace="http://www.springframework.org/schema/beans"/><xsd:element name="application"><xsd:complexType><xsd:complexContent><xsd:extension base="beans:identifiedType"><xsd:attribute name="name" type="xsd:string" use="required"/></xsd:extension></xsd:complexContent></xsd:complexType></xsd:element></xsd:schema> 復制代碼

    上面 XSD 文件中 www.test.com/demo 為自定義命名空間地址,下面將會使用到。

    實現 BeanDefinitionParser

    這里實現 BeanDefinitionParser,真正解析 XML 動作在這里完成。

    由于上面的例子比較簡單,我們可以直接繼承 Spring 提供的抽象類 AbstractSingleBeanDefinitionParser,然后實現相關方法就可以了。

    public class DemoBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {/*** 返回最會需要注入 Spring Bean 的類型* @param element* @return*/@Overrideprotected Class<?> getBeanClass(Element element) {return DemoApplication.class;}/**** 這個方法完成真正解析動作* @param element* @param builder*/@Overrideprotected void doParse(Element element, BeanDefinitionBuilder builder) {String name=element.getAttribute("name");builder.addPropertyValue("name",name);} }復制代碼

    當然也可以直接實現 BeanDefinitionParser,這樣更加靈活,但是這樣相比于上面這個就比較復雜了。

    public class BeanApplicationDefinitionParser implements BeanDefinitionParser {@Overridepublic BeanDefinition parse(Element element, ParserContext parserContext) {String name=element.getAttribute("name");// Bean 定義,最后根據這個生產 BeanRootBeanDefinition rootBeanDefinition=new RootBeanDefinition();rootBeanDefinition.setBeanClass(DemoApplication.class);rootBeanDefinition.setLazyInit(false);// 添加解析的屬性rootBeanDefinition.getPropertyValues().add("name",name);// 將生成的 BeanDefinition 注冊,少了這一步將會導致最后生成 Bean 時報錯parserContext.getRegistry().registerBeanDefinition("application",rootBeanDefinition);return rootBeanDefinition;} } 復制代碼

    實現 NamespaceHandler

    這一步實現 NamespaceHandler,開發者自定義 NamespaceHandler 只要繼承 NamespaceHandlerSupport 抽象類,實現 init 方法。在這個方法中注冊上面一步實現 BeanDefinitionParser。

    public class DemoNameSpaceHandler extends NamespaceHandlerSupport {@Overridepublic void init() {// elementName 為命名空間registerBeanDefinitionParser("application",new BeanApplicationDefinitionParser());} } 復制代碼

    注冊 XSD 以及 NamespaceHandler

    這一步我們需要在 META-INF 中生成兩個配置文件,分別為 spring.handlers,spring.schemas。

    spring.schemas 指定 XSD 文件路徑。

    http\://www.test.com/demo/demo.xsd=com/spring/learning/xml/schemas/autoring/leanrn/demo.xsd 復制代碼

    spring.handlers 指定 NamespaceHandler 完整類名,既包含前面的包名。

    這里需要注意的是 : 需要進行轉義

    測試運行

    首先我們生產 Spring XML 配置文件。

    <?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:demo="http://www.test.com/demo"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.test.com/demo http://www.test.com/demo/demo.xsd"><demo:application name="test" id="test"/> </beans> 復制代碼

    這里需要注意需要使用 XSD 文件中定義 http://www.test.com/demo。

    接著我們使用 SpringBoot ,導入 XML 文件,然后運行。

    @SpringBootApplication @ImportResource(locations = {"classpath:applicationContext.xml"}) public class XmlSchemaApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(XmlSchemaApplication.class, args);DemoApplication demoApplication=applicationContext.getBean(DemoApplication.class);System.out.println("application name is "+demoApplication.getName());} } 復制代碼

    輸出結果為:

    application name is test

    Spring XML 擴展機制源碼研究

    這里我們主要研究自定義 XML 擴展文件如何被 Spring 加載。

    Spring 啟動過程中會通過 BeanDefinitionDocumentReader 讀取 beans 標簽里面所有配置,這個過程將會通過 BeanDefinitionParserDelegate#parseCustomElement 解析自定義元素。

    上面解析過程可以獲得自定義 NamespaceHandler,然后調用 parse 方法解析。

    接著我們查看 NamespaceHandlerResolver#resolve 方法,查看如何獲取自定義 NamespaceHandler 。

    在這個方法中,主要是從 handlerMappings 緩存中獲取 NamespaceHandler。而該緩存來源于 getHandlerMappings 方法,這個方法將會加載我們上面自定義 spring.handlers 文件。

    看完 Spring 加載 NamespaceHandler 過程,下面我們查看最重要 BeanDefinition 如何生成。

    上面已經講到 Spring 會使用 NamespaceHandler.parse 解析,由于我們繼承了 NamespaceHandlerSupport,查看里面具體實現。

    獲取到 BeanDefinition 會將其注冊到容器中,然后會通過 BeanDefinition生成 Bean。這個生成過程不屬于本章節內容,所以不再概述,感興趣同學可以自行搜索。

    Dubbo XML Schema 擴展實現

    最后我們查看 Dubbo XML Schema 擴展如何實現。

    可以看到 Dubbo XML Schema 擴展剛好對應 Spring 四個標準的步驟。

    總結

    最后用一張圖片總結全文內容。

    幫助文檔

    xsd-custom-registration
    Spring中的XML schema擴展機制

    轉載于:https://juejin.im/post/5d06018b518825276a286a3d

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的缘起 Dubbo ,讲讲 Spring XML Schema 扩展机制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久精品视频日本 | 久久99精品久久久久久水蜜桃 | 国产伦理在线观看 | www.白虎| 中文字幕在线播放日韩 | www.狠狠插 | 你懂的国产 | 国产精品毛片一区二区在线看舒淇 | 国产不卡网 | 别揉我奶头啊嗯一区二区 | 日韩免费一区二区三区 | 在线观看欧美视频 | 中文日韩av | 久操不卡 | 中文字幕第10页 | 一区二区三区精品视频在线观看 | 欧美一级在线播放 | 熟女人妻aⅴ一区二区三区60路 | 亚洲在线观看免费视频 | 已满十八岁免费观看全集动漫 | chinesepron hd videos国产91| 亚洲自拍三区 | 又黄又爽的视频在线观看 | 密臀av在线播放 | 午夜国产一区二区 | 91亚洲精品久久久久久久久久久久 | 777久久久精品一区二区三区 | 人妻无码久久一区二区三区免费 | 成人深夜视频 | 女人张开腿让男人插 | 无码精品国产一区二区三区 | 91av视频在线免费观看 | 99久久精品免费看国产免费软件 | 欧美蜜桃视频 | 91视频你懂的 | 欧美成人手机视频 | 欧美精品久久久久a | 色婷婷在线视频 | 枫可怜av| 青青草视频播放器 | 色网在线看 | 亚洲一区二区三区欧美 | 午夜秋霞网 | 毛片视 | 欧美激情一区二区三级高清视频 | 在线中文天堂 | 99精品视频在线免费观看 | 风间由美一区二区 | 自拍偷拍亚洲视频 | 激情国产视频 | 肉大捧一进一出免费视频 | 国产夫妻性生活视频 | 在线视频一区二区 | 欧美日韩免费观看视频 | 少妇裸体性生交 | 久久免费毛片 | 大尺度叫床戏做爰视频 | 搡老熟女老女人一区二区 | 69精品丰满人妻无码视频a片 | 亚洲粉嫩 | 欧美在线激情 | 日韩一区视频在线 | 亚洲一区二区蜜桃 | av影院在线播放 | 久草国产在线 | 国产成人精品综合在线观看 | 99热欧美 | 精品人妻一区二区免费 | 日韩国产精品一区二区三区 | 伊人欧美在线 | 日韩精品无码一本二本三本色 | 亚洲一区二区三区四区五区xx | 熟女少妇在线视频播放 | 超碰在 | 日韩精品电影一区 | 欧美日韩在线观看一区二区 | 日韩成人福利视频 | 激情网站在线观看 | 国产精品xxxx喷水欧美 | 又黄又色又爽 | 欧美午夜三级 | 日本黄色大片在线观看 | 亚洲情se| 午夜少妇 | 国产乱码精品一区二区三区忘忧草 | 久久99精品久久久久子伦 | www.xxx.日本 | 日韩视频二区 | 好吊视频一区二区三区四区 | 国产区精品在线观看 | 在线天堂1| 亚洲欧美激情视频 | 亚洲九九精品 | 久久九九国产精品 | 国产精品久久久久无码av | 国产91在线看 | 久久久久免费精品视频 | 女性裸体无遮挡胸 | 国产精品自拍网站 |