国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

擴展spring schema文件

xiyang / 2114人閱讀

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

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

0x01 擴展配置步驟

在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容器在啟動的時候會根據這兩個文件的配置加載文件內容,然后去解析文件中的配置信息。下面來看下具體的配置信息:

spring.handlers文件的配置內容:

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

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

spring.schemas文件的配置內容:

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 解析配置

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

public class RpcNamespaceHandler extends NamespaceHandlerSupport {

    public void init() {

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

上面實例主要說明service這個自定義標簽通過new RpcBeanDefinitionParser(ServerBean.class)通過這個parser進行解析。

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實現解析操作,上面的實現比較簡單就是將對應標簽的屬性值取出來然后構建出具體的bean。

到這整個擴展schema該進行的操作就都已經就緒了。

0x05 使用配置

spring配置文件:




    

    

    

這里通過spring的配置對擴展的schema定義配置,當spring容器加載的時候會加載、解析這份自定義的配置,實現擴展。

實例:

加載配置獲得自定義的配置對象進行調用。

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());
    }

}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66073.html

相關文章

  • 談談spring如何自定義標簽

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

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

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

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

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

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

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

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

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

    Ashin 評論0 收藏0

發表評論

0條評論

xiyang

|高級講師

TA的文章

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