日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring XML Schema擴展機制的使用示例

瀏覽:65日期:2023-07-12 17:59:07
目錄前言XML Schema擴展XSD配置spring.handlers和spring.schemasNameSpaceHandler與BeanDefinitionParser使用總結前言

在當前Java生態,Spring算的上是最核心的框架,所有的開發組件想要得到大范圍更便捷的使用,都要和Spring進行整合,比如我們熟知的Mybatis、Dubbo等,以及內部封裝的各類組件包括Redis、MQ、配置中心等。

有了整合這一步,我們只需引入相應的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 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 beanBeanDefinitionBuilder 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-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 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擴展機制的使用示例的詳細內容,更多關于Spring XML Schema擴展機制的使用的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美激情五月| 亚洲专区欧美专区| 日本少妇一区二区| 青草国产精品| 欧美日韩一区二区三区四区在线观看 | 亚洲一区中文| 国产综合婷婷| 亚洲精品一二三区区别| 亚洲欧美日韩国产一区| 日本久久二区| 精品视频一二| 久久久久国产| 亚洲精品观看| 国产一区二区三区探花| 亚洲一级黄色| 日韩av资源网| 国产白浆在线免费观看| 九九在线精品| 欧美日韩午夜电影网| 国产不卡精品| 日韩在线观看一区二区| 日本aⅴ免费视频一区二区三区| 欧美在线观看天堂一区二区三区| 欧美a在线观看| 亚洲黄页一区| 精品久久亚洲| 亚洲精品高潮| 亚洲精品88| 日韩一区二区三区在线看| 日本精品黄色| 欧美一区在线观看视频| 久久中文字幕二区| 欧美经典一区| 日本成人在线一区| 婷婷综合社区| 亚洲黄色中文字幕| 亚洲+小说+欧美+激情+另类| www.51av欧美视频| 欧美中文一区| 久久成人精品| 激情六月综合| 福利一区二区三区视频在线观看| 蜜臀久久99精品久久久久宅男| 91免费精品| 免费在线观看一区| 日韩中文字幕亚洲一区二区va在线 | 日韩极品在线观看| 日本欧美在线看| 欧美日韩精品在线一区| 国产精品中文字幕亚洲欧美| 视频一区国产视频| 精品一区毛片| 午夜欧美精品| 欧美va天堂| 婷婷激情综合| 日韩一级网站| 欧美日韩国产亚洲一区| 日韩不卡视频在线观看| 成人国产精品久久| 福利一区二区三区视频在线观看| 久久精品国产久精国产| 欧美日韩一区自拍| 国产日韩高清一区二区三区在线 | 日韩高清不卡| 日韩电影免费网址| 性感美女一区二区在线观看| 丁香婷婷久久| 久久久精品午夜少妇| 色在线视频观看| 亚洲va中文在线播放免费| 欧美国产91| 免费在线观看不卡| 欧美在线看片| 中文字幕一区久| av在线最新| 一本大道色婷婷在线| 亚洲婷婷免费| 亚洲最新av| 嫩草伊人久久精品少妇av杨幂 | 亚洲精品成人| 天海翼精品一区二区三区| 欧美另类中文字幕| 日韩av在线播放网址| 夜夜嗨网站十八久久| 久久精品99国产精品日本| 国产一区调教| 亚洲一区二区日韩| 大香伊人久久精品一区二区| 最近高清中文在线字幕在线观看1| 欧美精选一区二区三区| 婷婷精品在线| 亚洲综合在线电影| 日韩欧美久久| 久久九九电影| 国产乱子精品一区二区在线观看| 国产精品13p| 国产区精品区| 伊人久久成人| 久久精品国产99国产精品| 欧美亚洲激情| 国产精品久久久久久妇女| 黄色免费成人| 超级白嫩亚洲国产第一| 视频精品一区二区| 成人精品国产亚洲| 涩涩涩久久久成人精品| 亚洲精品一区三区三区在线观看| 国产精品久久久久久久久免费高清 | 九色porny丨国产首页在线| 日韩精品免费视频人成| 蜜桃视频欧美| 色偷偷偷在线视频播放| 国产精品magnet| 亚洲美女久久| 伊人久久亚洲美女图片| 国产不卡精品| 国产成人精品一区二区免费看京| 91亚洲精品在看在线观看高清| 国产视频一区在线观看一区免费| 欧美sm一区| 日本在线精品| 欧美激情另类| 日韩成人亚洲| 亚洲一级二级| 欧美日韩国产亚洲一区| 精品欧美激情在线观看| 黄色在线一区| 乱人伦精品视频在线观看| 亚洲精品网址| 丝袜诱惑制服诱惑色一区在线观看 | 国产在线不卡| 国内精品99| 99视频+国产日韩欧美| 尤物tv在线精品| 欧美在线网站| 亚洲精品无播放器在线播放| 日韩一区精品| 麻豆成人91精品二区三区| 国产精品qvod| 精品国产欧美日韩| 日韩欧美三级| 日韩亚洲在线| 国产日韩欧美三级| 麻豆视频在线看| 9国产精品视频| 欧美一区激情| 中文字幕在线视频久| 狠狠干综合网| 国产精品欧美大片| 亚洲黑丝一区二区| 欧美日本精品| 日韩欧美字幕| 综合亚洲色图| 国产精品大片免费观看| av综合电影网站| 日韩在线卡一卡二| 精品一区视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美日韩亚洲一区在线观看| 理论片午夜视频在线观看| 久久国产高清| 亚洲国产成人二区| 午夜精品影视国产一区在线麻豆| 精品视频91| 亚洲va久久| 99久久久久| 免费视频一区二区三区在线观看| 久久高清免费| 国产伦一区二区三区| 黄色av日韩| 福利精品在线| 国产亚洲精品精品国产亚洲综合 | 精品伊人久久久| 色婷婷成人网| 西西人体一区二区| 亚洲日本网址| 久久久国产精品网站| 鲁大师成人一区二区三区| 高清不卡亚洲| 成人在线视频区| 久久亚州av| 亚洲专区视频| 欧美色图国产精品| 日韩免费福利视频| 精品欧美日韩精品| 国产精品手机在线播放| 色8久久久久| 蜜臀久久99精品久久久久久9| 国内激情久久| 悠悠资源网久久精品| 欧美中文一区二区| 国产乱码午夜在线视频| 最新中文字幕在线播放| 超碰99在线| 在线观看精品| 欧美 日韩 国产一区二区在线视频 | 日韩高清成人| 亚洲精品电影| 亚洲一区黄色| 亚洲精品一区二区在线播放∴|