91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring XML Schema擴展機制怎么用

發布時間:2021-05-31 14:22:40 來源:億速云 閱讀:161 作者:小新 欄目:開發技術

這篇文章主要介紹Spring XML Schema擴展機制怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

前言

在當前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 id="xxx" 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 bean
        BeanDefinitionBuilder 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-id="http://www.hexup.com/schema/distributed-id"
       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 id="test" 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擴展機制怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤庆县| 沂南县| 夏津县| 阜新市| 托里县| 尼玛县| 车险| 六枝特区| 张家港市| 齐齐哈尔市| 禹城市| 磐石市| 尚志市| 本溪市| 吉林省| 芮城县| 宣化县| 交城县| 军事| 夹江县| 青龙| 孙吴县| 信宜市| 阜新| 北京市| 凌源市| 仪征市| 孟州市| 永仁县| 泾川县| 呈贡县| 临洮县| 沙坪坝区| 丽江市| 普定县| 禄丰县| 宜君县| 遵义县| 清丰县| 铁岭县| 云浮市|