最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Spring自定義XML schema 擴(kuò)展的問(wèn)題(Spring面試高頻題)

 更新時(shí)間:2021年05月26日 10:19:48   作者:java金融  
今天給大家分享一道spring高頻率面試題關(guān)于Spring自定義XML schema 擴(kuò)展的問(wèn)題,今天以spring整合dubbo的實(shí)例給大家詳細(xì)講解下,感興趣的朋友跟隨小編一起看看吧

引言

自從SpringBoot時(shí)代的到來(lái),去除了Spring的各種繁瑣的XML配置,讓我們可以騰出雙手以便于更加專(zhuān)注的搬磚。記得那時(shí)候剛學(xué)Spring的時(shí)候,每天被Spring的各種XMl配置文件折磨的不行,每引入一個(gè)新的框架,最擔(dān)心的就是jar沖突、哪個(gè)配置文件又配的不對(duì)、配置文件沒(méi)有起作用。所以每次搭建好一個(gè)項(xiàng)目就把配置文件用小筆記記錄下來(lái), 方便下次在整合項(xiàng)目的時(shí)候直接copy復(fù)制就好。下面我們就以Spring整合dubbo的事例看下

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="demo-provider"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:protocol name="dubbo" port="20890"/>
    <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
    <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
</beans>

上述代碼中我們有看到dubbo自定義了一套自己的標(biāo)簽,dubbo:application ,dubbo:registry ,dubbo:protocol,dubbo:service我們心中是不是有點(diǎn)小疑問(wèn):這些標(biāo)簽在Spring項(xiàng)目啟動(dòng)的時(shí)候是如何被Spring管理的?是怎樣被Spring來(lái)識(shí)別的?如果我們自己隨便定義一個(gè)標(biāo)簽Spring是否能夠識(shí)別?我們?nèi)シ?code>Spring的官網(wǎng)發(fā)現(xiàn)這玩意其實(shí)就是Spring提供的 XML schema 的擴(kuò)展支持。只要按照它的步驟來(lái),我們就可以配置任何我們自定義的標(biāo)簽。XML schema 擴(kuò)展機(jī)制是什么?這個(gè)也許好多人沒(méi)聽(tīng)過(guò):

Spring 為基于 XML 構(gòu)建的應(yīng)用提供了一種擴(kuò)展機(jī)制,用于定義和配置 Bean。它允許使用者編寫(xiě)自定義的 XML bean 解析器,并將解析器本身以及最終定義的 Bean 集成到 Spring IOC 容器中。

我們可以看看官網(wǎng)https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#xml-custom 10.2. XML Schema Authoring 這個(gè)是主要介紹它的。

如何實(shí)現(xiàn)一個(gè)自定義 XML 擴(kuò)展

官網(wǎng)有介紹,要實(shí)現(xiàn)一個(gè)自定義的XML Schema 總共需要4步:

編寫(xiě)一個(gè) XML schema 文件描述的你節(jié)點(diǎn)元素。

編寫(xiě)一個(gè) NamespaceHandler 的實(shí)現(xiàn)類(lèi)

編寫(xiě)一個(gè)或者多個(gè) BeanDefinitionParser 的實(shí)現(xiàn) (關(guān)鍵步驟).

注冊(cè)上述的 schema 和 handler。

既然只要按照這四步來(lái),那我們就照著這個(gè)文檔來(lái)自己實(shí)現(xiàn)一個(gè)。

Authoring the Schema

編寫(xiě)一個(gè)javajr.xsd 放入項(xiàng)目的resources/META-INF文件夾里面(這個(gè)也可以是其他路徑)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:beans="http://www.springframework.org/schema/beans"
            xmlns:tool="http://www.springframework.org/schema/tool"
            xmlns="https://www.javajr.cn/schema/javajr"
            targetNamespace="https://www.javajr.cn/schema/javajr">
 
    <xsd:import namespace="http://www.springframework.org/schema/beans"/>
 
    <xsd:element name="application">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="website" type="xsd:string" use="required"/>
                    <xsd:attribute name="weixin" type="xsd:string" use="required"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
  • targetNamespace="https://www.javajr.cn/schema/javajr"
  • 這里targetNamespace的地址后面有用到。

這里我們就定義了一個(gè)元素application 里面有兩個(gè)屬性分別為websiteweixin。

編寫(xiě)一個(gè) NamespaceHandler

package org.spring.demo.schema;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MyNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
     // 這個(gè)名字也不是隨便取的,上面編寫(xiě)xsd的根節(jié)點(diǎn)元素的name, <xsd:element name="application">
        registerBeanDefinitionParser("application", new MyBeanDefinitionParser());
    }
}

這個(gè)NamespaceHandler 就是將一個(gè) XML 節(jié)點(diǎn)解析成 IOC 容器中的一個(gè)實(shí)體類(lèi)。也就是說(shuō)相當(dāng)于在xml里面的配置的對(duì)象,通過(guò)Spring ioc 容器管理起來(lái)了

編寫(xiě) BeanDefinitionParser 的實(shí)現(xiàn)類(lèi)

package org.spring.demo.schema;
import org.spring.demo.domain.JavajrDomain;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
 
public class MyBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
 
    @Override
    protected Class<?> getBeanClass(Element element) {
        return JavajrDomain.class;
    }
    @Override
    protected void doParse(Element element, BeanDefinitionBuilder bean) {
        // this however is an optional property
        String website = element.getAttribute("website");
        if (StringUtils.hasText(website)) {
            bean.addPropertyValue("website",website);
        }
        String weiXin = element.getAttribute("weixin");
        if (StringUtils.hasText(weiXin)) {
            bean.addPropertyValue("weixin",weiXin);
        }
    }
}

上面在這個(gè)實(shí)現(xiàn)類(lèi)只是簡(jiǎn)單的做了一個(gè)賦值操作,你如果需要有自己的邏輯業(yè)務(wù)也可以自行來(lái)實(shí)現(xiàn)。上面還有一個(gè)JavajrDomain這個(gè)實(shí)體類(lèi)就不貼代碼,就一個(gè)簡(jiǎn)單的javabean里面包含了兩個(gè)屬性weixin和website。

注冊(cè)schema組件

最后在resources/META-INF目錄下添加兩個(gè)配置文件(spring.handler和spring.schema):

resources/META-INF/spring.handlers

https\://www.javajr.cn/schema/javajr=org.spring.demo.schema.MyNamespaceHandler

resources/META-IN/spring.schemas

https\://www.javajr.cn/schema/javajr.xsd=META-INF/javajr.xsd

在這個(gè)地方的時(shí)候我們其實(shí)可以以版本號(hào)來(lái)進(jìn)行命名,方便我們可以使用多個(gè)不同的版本,Spring-beans 就是這么玩的。

測(cè)試自定義schema

resources 目錄下新建一個(gè)applicationContext.xml文件

這個(gè)文件就是使用下我們我們自己自定義的schema,這個(gè)文件需要注意的就是上面標(biāo)紅的這幾行,一般如果我們有引入過(guò)第三方的框架,比如mq、或者dubbo等它們都有自定義的這些玩意。

編寫(xiě)一個(gè)啟動(dòng)類(lèi)

public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        JavajrDomain bean = ctx.getBean(JavajrDomain.class);
        System.out.println(bean.toString());
    }

我們可以看到控制臺(tái)輸出

JavajrDomain{weixin='javajr8', website='javajr.cn'}

到這里我們自己實(shí)現(xiàn)的一個(gè) XML schema 就完成了,是不是很簡(jiǎn)單,只要照著官方文檔擼就可以了。照著擼的過(guò)程可能有幾個(gè)小細(xì)節(jié)需要注意下引入 XML schema 的時(shí)候需要注意下空格,或者一些特殊符號(hào)。上述代碼已經(jīng)提交到了gitee上https://gitee.com/javajr/spring-schema-demo 感興趣的朋友可以直接下載下來(lái)run下,不過(guò)還是不建議這么玩,最好還是自己動(dòng)手去嘗試下,畢竟也就四步,照著文檔來(lái)。

Dubbo 中的 XML schema 擴(kuò)展

在文章開(kāi)始的時(shí)候我們有介紹dubbo 自定義的XML schema ,下面我們一起打開(kāi)dubbo源碼看看它是如何來(lái)實(shí)現(xiàn)的,看下面這個(gè)截圖,也是按照那四步來(lái)的。

SpringBoot的starter

現(xiàn)在有了SpringBoot 之后以前用這個(gè) XML schema配置的框架,大多數(shù)都會(huì)有對(duì)應(yīng)的starter來(lái)進(jìn)行封裝,starter的使用比起 XML schema的使用還是簡(jiǎn)單多了,開(kāi)箱即用,無(wú)需編寫(xiě)很多的配置文件。如果不是很清楚SpringBootstarter的推薦去看看這兩篇文章《面試高頻題:springBoot自動(dòng)裝配的原理你能說(shuō)出來(lái)嗎?》《保姆級(jí)教程,手把手教你實(shí)現(xiàn)一個(gè)SpringBoot的starter》。

總結(jié)

雖然現(xiàn)在XML schema 擴(kuò)展用的不多了,但是應(yīng)該也還有比較老的項(xiàng)目在使用吧,如果還是比較老的項(xiàng)目,需要引入一個(gè)什么樣的框架,我們至少需要知道需要怎么去引入,網(wǎng)上雖然有很多文章可以借鑒,但是我們也應(yīng)該知其然知其所以然。而不是直接把配置文件單純的copy過(guò)來(lái)。我們應(yīng)該知道為啥需要copy這個(gè)xsd,為什么沒(méi)有這個(gè)xsd ,idea不糊識(shí)別會(huì)報(bào)錯(cuò)。

以上就是關(guān)于Spring自定義XML schema 擴(kuò)展的問(wèn)題(Spring面試高頻題)的詳細(xì)內(nèi)容,更多關(guān)于Spring XML schema 擴(kuò)展的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解

    JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解

    這篇文章主要為大家介紹了JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 為什么Java項(xiàng)目中別用!=null做判空

    為什么Java項(xiàng)目中別用!=null做判空

    本文主要介紹了為什么Java項(xiàng)目中別用!=null做判空,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • spring聲明式事務(wù)@Transactional開(kāi)發(fā)常犯的幾個(gè)錯(cuò)誤及最新解決方案

    spring聲明式事務(wù)@Transactional開(kāi)發(fā)常犯的幾個(gè)錯(cuò)誤及最新解決方案

    使用聲明式事務(wù)@Transactional進(jìn)行事務(wù)一致性的管理,在開(kāi)發(fā)過(guò)程中,發(fā)現(xiàn)很多開(kāi)發(fā)同學(xué)都用錯(cuò)了spring聲明式事務(wù)@Transactional或使用不規(guī)范,導(dǎo)致出現(xiàn)各種事務(wù)問(wèn)題,這篇文章主要介紹了spring聲明式事務(wù)@Transactional開(kāi)發(fā)常犯的幾個(gè)錯(cuò)誤及解決辦法,需要的朋友可以參考下
    2024-02-02
  • 一篇文章帶你了解java泛型--泛型類(lèi),泛型方法,泛型接口

    一篇文章帶你了解java泛型--泛型類(lèi),泛型方法,泛型接口

    這篇文章主要介紹了java泛型基礎(chǔ)知識(shí)及通用方法,從以下幾個(gè)方面介紹一下java的泛型: 基礎(chǔ), 泛型關(guān)鍵字, 泛型方法, 泛型類(lèi)和接口,感興趣的可以了解一下
    2021-08-08
  • 使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)

    使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)

    這篇文章主要為大家詳細(xì)介紹了使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 關(guān)于shiro中部分SpringCache失效問(wèn)題的解決方法

    關(guān)于shiro中部分SpringCache失效問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于shiro中部分SpringCache失效問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Java中的zookeeper常用命令詳解

    Java中的zookeeper常用命令詳解

    這篇文章主要介紹了Java中的zookeeper常用命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式

    java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式

    本文主要介紹了java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Spring集成jedis的配置與使用簡(jiǎn)單實(shí)例

    Spring集成jedis的配置與使用簡(jiǎn)單實(shí)例

    今天小編就為大家分享一篇關(guān)于Spring集成jedis的配置與使用簡(jiǎn)單實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • 親手帶你解決Debug Fastjson的安全漏洞

    親手帶你解決Debug Fastjson的安全漏洞

    這篇文章主要介紹了親手帶你解決Debug Fastjson的安全漏洞,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評(píng)論

屯昌县| 十堰市| 积石山| 渝北区| 霍林郭勒市| 闵行区| 明溪县| 通化市| 仙游县| 拜泉县| 曲周县| 凉山| 凤山市| 双江| 广南县| 眉山市| 革吉县| 和田市| 昌都县| 增城市| 桦甸市| 镇宁| 台前县| 拜泉县| 贺州市| 广德县| 油尖旺区| 新绛县| 建水县| 临清市| 涞源县| 普宁市| 天镇县| 通城县| 新乐市| 尼玛县| 彩票| 湛江市| 宝丰县| 通渭县| 辽中县|