成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

擴(kuò)展spring schema文件

xiyang / 2167人閱讀

摘要:指明了文件的位置,會(huì)使用這里制定的文件來(lái)驗(yàn)證配置的正確性。解析配置通過(guò)實(shí)現(xiàn)完成對(duì)自定義的文件的解析工作。到這整個(gè)擴(kuò)展該進(jìn)行的操作就都已經(jīng)就緒了。

spring我們?cè)陂_(kāi)發(fā)過(guò)程中是個(gè)必不可少的框架,我們通常會(huì)將我們程序中的bean交由spring容器來(lái)進(jìn)行管理,應(yīng)用程序需要用到bean的時(shí)候從spring容器中去獲取,spring是如何實(shí)現(xiàn)這種方式的呢?spring的配置文件,當(dāng)我們?cè)陂_(kāi)發(fā)的過(guò)程中發(fā)現(xiàn)spring提供的配置命令不滿(mǎn)足的情況下我們?cè)撛趺崔k呢?我們是不是要自己去解析原生的xml文件?當(dāng)然不用spring為開(kāi)發(fā)者提供了可擴(kuò)展的schema的支持,可以支持自定義配置。

0x01 擴(kuò)展配置步驟

在classpath的META-INF下定義另個(gè)文件:spring.handlers、spring.schemas(識(shí)別配置)

自定義xsd文件(定義配置)

繼承org.springframework.beans.factory.xml.NamespaceHandlerSupport、org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser(解析配置)

0x02 識(shí)別配置

spring如何識(shí)別自定的schema文件

spring.handlers指明命名空間需要哪個(gè)類(lèi)來(lái)處理。

spring.schemas指明了schema文件的位置,spring會(huì)使用這里制定的xsd文件來(lái)驗(yàn)證配置的正確性。

spring容器在啟動(dòng)的時(shí)候會(huì)根據(jù)這兩個(gè)文件的配置加載文件內(nèi)容,然后去解析文件中的配置信息。下面來(lái)看下具體的配置信息:

spring.handlers文件的配置內(nèi)容:

http://code.liutxer.com/schema/bymq=com.liutxer.by.conf.RpcNamespaceHandler

http://code.liutxer.com/schem...這個(gè)命名空間使用com.liutxer.by.conf.RpcNamespaceHandler這個(gè)類(lèi)來(lái)處理。

spring.schemas文件的配置內(nèi)容:

http://code.liutxer.com/schema/bymq/rpc.xsd=META-INF/rpc.xsd

http://code.liutxer.com/schem...文件的位置在classpath:/META-INF/rpc.xsd中

0x03 定義配置



    

    
        
            
                
                    
                    
                
            
        
    

    
        
            
                
                    
                    
                
            
        
    

其中要注意的點(diǎn)主要有xmlns--xml namespace、targetNamespace這兩個(gè)的定義。

0x04 解析配置

通過(guò)實(shí)現(xiàn)NamespaceHandlerSupport、BeanDefinitionParser完成對(duì)自定義的schema文件的解析工作。
NamespaceHandlerSupport會(huì)根據(jù)schema的節(jié)點(diǎn)名稱(chēng)來(lái)找到某個(gè)BeanDefinitionParser然后由BeanDefinitionParser來(lái)完成具體的解析工作,因此我們需要具體實(shí)現(xiàn)自己的NamespaceHandlerSupport和BeanDefinitionParser。下面看下具體實(shí)現(xiàn):

public class RpcNamespaceHandler extends NamespaceHandlerSupport {

    public void init() {

        registerBeanDefinitionParser("service", new RpcBeanDefinitionParser(ServerBean.class));
        registerBeanDefinitionParser("reference", new RpcBeanDefinitionParser(ReferenceBean.class));
    }
}

上面實(shí)例主要說(shuō)明service這個(gè)自定義標(biāo)簽通過(guò)new RpcBeanDefinitionParser(ServerBean.class)通過(guò)這個(gè)parser進(jìn)行解析。

public class RpcBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    private Class beanClass;

    public RpcBeanDefinitionParser(Class beanClass) {
        this.beanClass = beanClass;
    }

    protected Class getBeanClass(Element element) {
        return this.beanClass;
    }
    protected void doParse(Element element, BeanDefinitionBuilder bean) {
        if (ServerBean.class.equals(this.beanClass)) {

            String interfaceVal = element.getAttribute("interface");
            String refVal = element.getAttribute("ref");
            Object reference = new RuntimeBeanReference(refVal);

            if (StringUtils.hasText(interfaceVal)) {
                bean.addPropertyValue("interfaceVal", interfaceVal);
            }
            if (reference != null) {
                bean.addPropertyValue("ref", reference);
            }

        } else if (ReferenceBean.class.equals(this.beanClass)) {
            String beanName = element.getAttribute("id");
            String interfaceVal = element.getAttribute("interface");

            if (StringUtils.hasText(interfaceVal)) {
                bean.addPropertyValue("interfaceVal", interfaceVal);
            }
            if (StringUtils.hasText(beanName)) {
                bean.addPropertyValue("beanName", beanName);
            }

        }
    }
}

具體的BeanDefinitionParser實(shí)現(xiàn)解析操作,上面的實(shí)現(xiàn)比較簡(jiǎn)單就是將對(duì)應(yīng)標(biāo)簽的屬性值取出來(lái)然后構(gòu)建出具體的bean。

到這整個(gè)擴(kuò)展schema該進(jìn)行的操作就都已經(jīng)就緒了。

0x05 使用配置

spring配置文件:




    

    

    

這里通過(guò)spring的配置對(duì)擴(kuò)展的schema定義配置,當(dāng)spring容器加載的時(shí)候會(huì)加載、解析這份自定義的配置,實(shí)現(xiàn)擴(kuò)展。

實(shí)例:

加載配置獲得自定義的配置對(duì)象進(jìn)行調(diào)用。

public class Test {
    
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:app.xml");
        IDemoTest demoTest = (IDemoTest) ctx.getBean("demoTest");
        System.out.println("spring rpc test:" + demoTest.get());
    }

}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/66073.html

相關(guān)文章

  • 談?wù)?em>spring如何自定義標(biāo)簽

    摘要:干貨點(diǎn)了解如何基于自定義標(biāo)簽,這是自定義組件的第一步。這第一篇,記錄基于如何自定義標(biāo)簽。所以,對(duì)于想擴(kuò)展組件的小伙伴來(lái)說(shuō),了解如何自定義標(biāo)簽和相應(yīng)的原理是必須走的第一步。到這一步,自定義標(biāo)簽的過(guò)程就全部理清楚了。 干貨點(diǎn) 了解如何基于spring自定義標(biāo)簽,這是自定義組件的第一步。而最重要的是了解了這個(gè)過(guò)程后也可以大致了解spring自身部分組件是怎么相互工作和觸發(fā)的,如spring-...

    Jokcy 評(píng)論0 收藏0
  • Spring詳解3.Bean的裝配

    摘要:的依賴(lài)關(guān)系,根據(jù)依賴(lài)關(guān)系配置完成之間的裝配。的行為信息,如生命周期范圍及生命周期各過(guò)程的回調(diào)函數(shù)。使用該種裝配模式時(shí),優(yōu)先匹配參數(shù)最多的構(gòu)造函數(shù)。如果提供了默認(rèn)的構(gòu)造函數(shù),則采用否則采用進(jìn)行自動(dòng)裝配。 點(diǎn)擊進(jìn)入我的博客 1 Spring容器與Bean配置信息 Bean配置信息 Bean配置信息是Bean的元數(shù)據(jù)信息,它由一下4個(gè)方面組成: Bean的實(shí)現(xiàn)類(lèi) Bean的屬性信息,如數(shù)...

    endiat 評(píng)論0 收藏0
  • spring+mongodb的整合

    摘要:版本不支持支持為,如果使用并且使用,則會(huì)出現(xiàn)提示,編譯出錯(cuò)。掃描的倉(cāng)庫(kù)目錄,會(huì)自動(dòng)掃描擴(kuò)展了接口的接口進(jìn)行注入。 mongodb介紹 MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。 MongoD...

    warmcheng 評(píng)論0 收藏0
  • spring+mongodb的整合

    摘要:版本不支持支持為,如果使用并且使用,則會(huì)出現(xiàn)提示,編譯出錯(cuò)。掃描的倉(cāng)庫(kù)目錄,會(huì)自動(dòng)掃描擴(kuò)展了接口的接口進(jìn)行注入。 mongodb介紹 MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。 MongoD...

    gaara 評(píng)論0 收藏0
  • Android UI : XML & 反射

    摘要:前言對(duì)于程序員來(lái)說(shuō)布局文件我們幾乎每天都會(huì)寫(xiě)好幾個(gè)而恰恰是很多每天都會(huì)用到的東西往往因?yàn)榱?xí)慣了而忽略對(duì)其原理的探究對(duì)文件的認(rèn)知反射配置文件定義格式疑問(wèn)大家應(yīng)該都有過(guò)這樣的需求在代碼中根據(jù)實(shí)時(shí)的數(shù)據(jù)通過(guò)代碼動(dòng)態(tài)控制而在使用的過(guò)程中就會(huì)明顯的感 前言 對(duì)于 Android 程序員來(lái)說(shuō), 布局 XML 文件我們幾乎每天都會(huì)寫(xiě)好幾個(gè), 而恰恰是很多每天都會(huì)用到的東西, 往往因?yàn)椤噶?xí)慣了」而忽略...

    Ashin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<