成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

擴(kuò)展spring schema文件

xiyang / 2124人閱讀

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

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

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

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

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

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

0x02 識別配置

spring如何識別自定的schema文件

spring.handlers指明命名空間需要哪個類來處理。

spring.schemas指明了schema文件的位置,spring會使用這里制定的xsd文件來驗證配置的正確性。

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

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

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

http://code.liutxer.com/schem...這個命名空間使用com.liutxer.by.conf.RpcNamespaceHandler這個類來處理。

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 定義配置



    

    
        
            
                
                    
                    
                
            
        
    

    
        
            
                
                    
                    
                
            
        
    

其中要注意的點主要有xmlns--xml namespace、targetNamespace這兩個的定義。

0x04 解析配置

通過實現(xiàn)NamespaceHandlerSupport、BeanDefinitionParser完成對自定義的schema文件的解析工作。
NamespaceHandlerSupport會根據(jù)schema的節(jié)點名稱來找到某個BeanDefinitionParser然后由BeanDefinitionParser來完成具體的解析工作,因此我們需要具體實現(xiàn)自己的NamespaceHandlerSupport和BeanDefinitionParser。下面看下具體實現(xiàn):

public class RpcNamespaceHandler extends NamespaceHandlerSupport {

    public void init() {

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

上面實例主要說明service這個自定義標(biāo)簽通過new RpcBeanDefinitionParser(ServerBean.class)通過這個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實現(xiàn)解析操作,上面的實現(xiàn)比較簡單就是將對應(yīng)標(biāo)簽的屬性值取出來然后構(gòu)建出具體的bean。

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

0x05 使用配置

spring配置文件:




    

    

    

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

實例:

加載配置獲得自定義的配置對象進(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66073.html

相關(guān)文章

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

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

    Jokcy 評論0 收藏0
  • Spring詳解3.Bean的裝配

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

    endiat 評論0 收藏0
  • spring+mongodb的整合

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

    warmcheng 評論0 收藏0
  • spring+mongodb的整合

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

    gaara 評論0 收藏0
  • Android UI : XML & 反射

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

    Ashin 評論0 收藏0

發(fā)表評論

0條評論

xiyang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<