欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2)

 更新時(shí)間:2016年11月07日 09:23:44   作者:linjisong  
這篇文章主要介紹了使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2)的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下

在上篇文章給大家介紹了使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(1),需要的朋友可以參考下。

編寫(xiě)好XSD文件,然后來(lái)看怎么使用XSD文件校驗(yàn),并解析SqlMapper文件,也就是實(shí)現(xiàn)doParseSqlMapperResourceWithSchema()方法。

為了實(shí)現(xiàn)這個(gè)功能,有兩個(gè)基本要求:

(1)兼容性:需要兼容mybatis的原生配置,兼容有兩種層級(jí),一種是使用DTD校驗(yàn),這個(gè)前面已經(jīng)說(shuō)了,走原來(lái)的流程,兼容性沒(méi)有問(wèn)題;另一種就是走XSD校驗(yàn),但也需要兼容mybatis原生配置,這種兼容性一方面從上面修改的XSD文件去保證,另一方面也需要從XML的解析去保證。

(2)擴(kuò)展性:修改的目的就是為了擴(kuò)展性,所以擴(kuò)展性也是一個(gè)基本要求。但是擴(kuò)展性不是隨意性,也需要按照規(guī)范來(lái)擴(kuò)展,這個(gè)規(guī)范就是自定義的XSD文件。

為了達(dá)到這兩個(gè)基本要求,下面是我的一種思路,主要借鑒于Spring的自定義命名空間:

1、創(chuàng)建一個(gè)EntityResolver,讀取類路徑下指定模式的配置文件,比如:"classpath*:**/dysd-*-namespaces.ini"

2、在ini文件中定義命名空間元信息,如:

使用命名空間作為Section的名稱,下面的schema、parser分別表示命名空間的xsd文件和解析器實(shí)現(xiàn)類,這樣就可以根據(jù)XML中的XSD命名空間找到校驗(yàn)文件,并且有一個(gè)解析入口了。

說(shuō)明:

apache的commons-configuration提供了ini格式文件的讀取API

Spring中使用META-INF/spring.schemas和META-INF/spring.handlers來(lái)存儲(chǔ)XSD文件和解析器實(shí)現(xiàn)類,這里我修改為使用ini文件集中配置

因?yàn)樽x取的是所有類路徑下滿足通配符的ini文件,因此可以非常簡(jiǎn)單的擴(kuò)展其它命名空間,至于在Java中具體怎么使用XSD來(lái)校驗(yàn),這里就不細(xì)說(shuō)了

我把XML的解析分解為三要素:解析上下文、解析器、被解析文件。doParseSqlMapperResourceWithSchema()方法也很簡(jiǎn)潔:

protected void doParseSqlMapperResourceWithSchema(Configuration configuration, Resource mapperLocation){
ISqlMapperParserContext context = new SqlMapperParserContext(configuration);
XmlParserUtils.parseXml(context, mapperLocation);
}

解析器接口如下:

public interface IParser<E extends IParserContext> {
public void parse(E parserContext, String location);
public void parse(E parserContext, String[] locationPatterns);
public void parse(E parserContext, InputStream inputStream);
public void parse(E parserContext, Resource resource);
}

解析上下文和解析器實(shí)現(xiàn)類又依次分為三個(gè)層級(jí):

(1)通用解析上下文:

public interface IParserContext { 
public ProblemReporter getProblemReporter();
public EventListener getEventListener();
public SourceExtractor getSourceExtractor();
public Environment getEnvironment();
}

相應(yīng)層級(jí)的解析器實(shí)現(xiàn)類主要負(fù)責(zé)加載被解析文件(比如將字符串通配符加載為Resource對(duì)象集合),保證不重復(fù)解析,保證可并發(fā)執(zhí)行等。

(2)XML解析上下文

public interface IXmlParserContext extends IParserContext{
public boolean isNamespaceAware(); 
public DocumentLoader getDocumentLoader();
public EntityResolver getEntityResolver();
public ErrorHandler getErrorHandler();
public XmlParserDelegate getDelegate();
}

相應(yīng)層級(jí)的解析器實(shí)現(xiàn)類主要負(fù)責(zé)將Resource轉(zhuǎn)換為Document對(duì)象,并在轉(zhuǎn)換的過(guò)程中進(jìn)行校驗(yàn)。

(3)SqlMapper解析上下文

public interface ISqlMapperParserContext extends IXmlParserContext{
public Configuration getConfiguration();
}

相應(yīng)層級(jí)的解析器實(shí)現(xiàn)類主要負(fù)責(zé)查找根元素所在命名空間的解析器,并使用解析器對(duì)Document進(jìn)行解析。

最終,將解析委托給ini配置文件中的SchemaSqlMapperNamespaceParser類,但是因?yàn)檫@個(gè)類需要在文本文件中配置,不方便有參數(shù)的構(gòu)造函數(shù),因而進(jìn)一步委托給SchemaSqlMapperParserDelegate:

public class SchemaSqlMapperNamespaceParser implements INamespaceParser<ISqlMapperParserContext> {
@Override
public void init() {
}
@Override
public void parse(ISqlMapperParserContext parserContext, Document document, Resource resource) {
SchemaSqlMapperParserDelegate delegate = new SchemaSqlMapperParserDelegate(parserContext, document, resource);
delegate.parse();
}
@Override
public void destory() {
}
}

至此,XSD校驗(yàn)已經(jīng)完成,也已經(jīng)找到XML解析入口,后續(xù)就是在SchemaSqlMapperParserDelegate中真正的解析了。

以上所述是小編給大家介紹的使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java NIO原理圖文分析及代碼實(shí)現(xiàn)

    Java NIO原理圖文分析及代碼實(shí)現(xiàn)

    本文主要介紹Java NIO原理的知識(shí),這里整理了詳細(xì)資料及簡(jiǎn)單示例代碼和原理圖,有需要的小伙伴可以參考下
    2016-09-09
  • 并發(fā)編程之Java內(nèi)存模型順序一致性

    并發(fā)編程之Java內(nèi)存模型順序一致性

    這篇文章主要介紹了并發(fā)編程Java內(nèi)存模型順序一致性,順序一致性內(nèi)存模型是一個(gè)理論參考模型,處理器的內(nèi)存模型和編程語(yǔ)言的內(nèi)存模型都會(huì)以順序一致性內(nèi)存模型作為參照,下面我們一起進(jìn)入文章看看學(xué)校內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Spring實(shí)現(xiàn)動(dòng)態(tài)修改時(shí)間參數(shù)并手動(dòng)開(kāi)啟關(guān)停操作

    Spring實(shí)現(xiàn)動(dòng)態(tài)修改時(shí)間參數(shù)并手動(dòng)開(kāi)啟關(guān)停操作

    spring實(shí)現(xiàn)定時(shí)任務(wù)的方式有三種,分別是java自帶的timer類、spring task和quartz三種。本文只介紹spring自帶的task和第三方quartz,感興趣的朋友參考下吧
    2017-09-09
  • 詳解spring如何使用注解開(kāi)發(fā)

    詳解spring如何使用注解開(kāi)發(fā)

    今天給大家整理了spring如何使用注解開(kāi)發(fā)這篇文章,文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之棧與綜合計(jì)算器的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之棧與綜合計(jì)算器的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中棧與綜合計(jì)算器的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2022-10-10
  • JAVA?String類中的一些常用方法示例詳解

    JAVA?String類中的一些常用方法示例詳解

    在我們的工作中,常常要對(duì)一個(gè)字符串進(jìn)行一些操作,這里提供一些常用的方法,常常需要這些方法進(jìn)行組合處理字符串,這篇文章主要給大家介紹了關(guān)于JAVA?String類中的一些常用方法,需要的朋友可以參考下
    2023-10-10
  • Java多線程之線程安全問(wèn)題詳解

    Java多線程之線程安全問(wèn)題詳解

    這篇文章主要為大家詳細(xì)介紹了Java多線程之線程安全問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Java 超詳細(xì)講解抽象類與接口的使用

    Java 超詳細(xì)講解抽象類與接口的使用

    對(duì)于面向?qū)ο缶幊虂?lái)說(shuō),抽象是它的一大特征之一,在 Java 中可以通過(guò)兩種形式來(lái)體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java入門(mén)基礎(chǔ)之抽象類與接口的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Spring?Boot?整合?FreeMarker?實(shí)例分享

    Spring?Boot?整合?FreeMarker?實(shí)例分享

    這篇文章主要分享了Spring?Boot整合FreeMarker?實(shí)例FreeMarker是一款模板引擎,即一種基于模板和要改變的數(shù)據(jù),并用來(lái)生成輸出文本,更多相關(guān)介紹需要的小伙伴可以參考下面文章內(nèi)容
    2022-05-05
  • 關(guān)于maven pom文件配置加載lib下的jar包

    關(guān)于maven pom文件配置加載lib下的jar包

    在項(xiàng)目中引用放置在lib文件夾中的第三方j(luò)ar包需要通過(guò)POM文件進(jìn)行特定配置,雖然將依賴放置在公司的Maven私服是更好的做法,但如果遇到部署問(wèn)題,可以利用maven-jar-plugin進(jìn)行配置,Spring Boot項(xiàng)目可以通過(guò)特定設(shè)置來(lái)實(shí)現(xiàn)
    2024-09-09

最新評(píng)論