成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:246日期:2023-07-13 18:34:21
引言

自從SpringBoot時(shí)代的到來,去除了Spring的各種繁瑣的XML配置,讓我們可以騰出雙手以便于更加專注的搬磚。記得那時(shí)候剛學(xué)Spring的時(shí)候,每天被Spring的各種XMl配置文件折磨的不行,每引入一個(gè)新的框架,最擔(dān)心的就是jar沖突、哪個(gè)配置文件又配的不對(duì)、配置文件沒有起作用。所以每次搭建好一個(gè)項(xiàng)目就把配置文件用小筆記記錄下來, 方便下次在整合項(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 /> <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)小疑問:這些標(biāo)簽在Spring項(xiàng)目啟動(dòng)的時(shí)候是如何被Spring管理的?是怎樣被Spring來識(shí)別的?如果我們自己隨便定義一個(gè)標(biāo)簽Spring是否能夠識(shí)別?我們?nèi)シ璖pring的官網(wǎng)發(fā)現(xiàn)這玩意其實(shí)就是Spring提供的 XML schema 的擴(kuò)展支持。只要按照它的步驟來,我們就可以配置任何我們自定義的標(biāo)簽。XML schema 擴(kuò)展機(jī)制是什么?這個(gè)也許好多人沒聽過:

Spring 為基于 XML 構(gòu)建的應(yīng)用提供了一種擴(kuò)展機(jī)制,用于定義和配置 Bean。它允許使用者編寫自定義的 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步:

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

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

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

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

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

Authoring the Schema

編寫一個(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è)屬性分別為website和weixin。

編寫一個(gè) NamespaceHandler

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

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

編寫 BeanDefinitionParser 的實(shí)現(xiàn)類

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 propertyString 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)類只是簡單的做了一個(gè)賦值操作,你如果需要有自己的邏輯業(yè)務(wù)也可以自行來實(shí)現(xiàn)。上面還有一個(gè)JavajrDomain這個(gè)實(shí)體類就不貼代碼,就一個(gè)簡單的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)來進(jìn)行命名,方便我們可以使用多個(gè)不同的版本,Spring-beans 就是這么玩的。

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

測試自定義schema

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

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

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

編寫一個(gè)啟動(dòng)類

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

Dubbo 中的 XML schema 擴(kuò)展

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

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

SpringBoot的starter

現(xiàn)在有了SpringBoot 之后以前用這個(gè) XML schema配置的框架,大多數(shù)都會(huì)有對(duì)應(yīng)的starter來進(jìn)行封裝,starter的使用比起 XML schema的使用還是簡單多了,開箱即用,無需編寫很多的配置文件。如果不是很清楚SpringBoot的starter的推薦去看看這兩篇文章《面試高頻題:springBoot自動(dòng)裝配的原理你能說出來嗎?》《保姆級(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過來。我們應(yīng)該知道為啥需要copy這個(gè)xsd,為什么沒有這個(gè)xsd ,idea不糊識(shí)別會(huì)報(bào)錯(cuò)。

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

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
eeuss鲁片一区二区三区在线观看| 中文字幕日韩av资源站| 国产精品免费久久久久| 成人激情免费网站| 欧美人动与zoxxxx乱| 日韩高清不卡一区| 色婷婷久久一区二区三区麻豆| 中文字幕亚洲一区二区av在线 | 欧美三级日本三级少妇99| 亚洲v中文字幕| 新狼窝色av性久久久久久| 亚洲国产一区二区视频| 免费日韩精品中文字幕视频在线| 亚洲综合免费观看高清在线观看| 国产欧美日韩综合精品二区| 一区二区三区四区在线播放 | 国产欧美丝祙| 亚洲欧美aⅴ...| 亚洲美女色禁图| 亚洲午夜私人影院| 国产日韩综合| 亚洲国产一区二区三区| 欧美亚洲视频| 亚洲成人免费视| 久久久精彩视频| 日本成人超碰在线观看| 色八戒一区二区三区| 九一九一国产精品| 欧美一区二区在线观看| 福利一区二区在线观看| 久久久久久毛片| 国产主播一区| 一区二区三区四区中文字幕| 欧美中文字幕| 老鸭窝一区二区久久精品| 欧美三级蜜桃2在线观看| 国产盗摄一区二区| 久久亚洲一级片| 狠狠久久综合婷婷不卡| 亚洲一区欧美一区| 一本大道久久a久久精二百 | 国产九色sp调教91| 2021久久国产精品不只是精品| 欧美国产91| 亚洲男同性恋视频| 免费在线成人| 国产在线观看免费一区| 精品福利av导航| 欧美三区不卡| 亚洲国产一区二区视频| 欧美三级中文字幕| caoporn国产一区二区| 国产精品欧美一区喷水| 在线一区欧美| 理论电影国产精品| 2023国产精华国产精品| 亚洲高清av| 日韩成人午夜电影| 欧美电视剧免费全集观看| 欧美午夜在线| 午夜视频久久久久久| 欧美日本在线观看| 97精品超碰一区二区三区| 亚洲嫩草精品久久| 欧美亚洲国产一区二区三区| 国产精品911| 国产精品成人在线观看| 久久这里只有| 懂色av一区二区夜夜嗨| 一区在线播放视频| 欧美视频三区在线播放| 欧美国产免费| 日韩高清在线电影| 精品播放一区二区| 国产农村妇女精品一二区| 久久国产精品色婷婷| 国产无一区二区| 免费亚洲视频| 波多野结衣亚洲一区| 亚洲综合视频在线| 欧美www视频| 国产毛片一区| 成人av资源站| 亚洲电影你懂得| 日韩视频在线永久播放| 日韩天天综合| 国产毛片精品视频| 亚洲人成在线播放网站岛国| 精品视频一区 二区 三区| 午夜精品影院| 日韩精品一二三区| 国产欧美日韩视频一区二区| 老牛国产精品一区的观看方式| 成人app下载| 图片区小说区国产精品视频| 亚洲精品在线观看网站| 久久久久久久久久久一区| 国产a区久久久| 亚洲一区二区欧美日韩| 欧美tickling网站挠脚心| 亚洲一区二区在线免费观看| av一区二区久久| 日韩国产高清影视| 国产精品毛片a∨一区二区三区| 精品1区2区3区| 亚洲午夜精品久久久久久app| 激情五月激情综合网| 日韩理论电影院| 日韩欧美国产一区在线观看| 蜜桃视频一区| 精品999成人| 国产成人亚洲综合a∨婷婷图片| 亚洲精品乱码久久久久久| 精品国产sm最大网站| 欧洲中文字幕精品| 国产精品一区二区你懂得| 99精品欧美一区二区三区小说| 天堂成人国产精品一区| 久久男人中文字幕资源站| 欧美视频中文字幕| 国产精品一区二区a| 欧美一区免费| 国产美女一区二区| 爽好多水快深点欧美视频| 国产精品日韩精品欧美在线| 日韩一区二区中文字幕| 久久久国产精品一区二区中文 | 欧美一区二区成人6969| 色狠狠一区二区三区香蕉| 亚洲欧洲三级| 91网页版在线| 国内精品第一页| 亚洲成在人线免费| 精品国产免费一区二区三区四区| 蜜桃一区二区三区四区| 国产精品情趣视频| 日韩免费一区二区三区在线播放| 香蕉国产精品偷在线观看不卡| 国产精品久久7| bt欧美亚洲午夜电影天堂| 麻豆国产精品视频| 亚洲一区免费视频| 亚洲三级久久久| 中文字幕第一区综合| 精品久久一区二区三区| 777亚洲妇女| 亚洲一区三区视频在线观看| 欧美日韩 国产精品| 不卡av在线免费观看| 国产乱人伦偷精品视频免下载| 日韩成人午夜精品| 亚洲成人自拍一区| 夜夜爽夜夜爽精品视频| 成人免费一区二区三区在线观看| 国产欧美一区二区精品性色超碰| 日韩欧美国产综合| 欧美一级欧美一级在线播放| 欧美浪妇xxxx高跟鞋交| 在线观看区一区二| 色女孩综合影院| 免费精品视频| 一区二区三区国产盗摄| 亚洲三级国产| 亚洲精品乱码久久久久久蜜桃91| 欧美日韩一区在线视频| 欧美xxx在线观看| 欧美成人嫩草网站| 欧美在线播放一区| 91蜜桃网址入口| 91首页免费视频| 欧美一区免费视频| 午夜精品久久| 午夜天堂精品久久久久| 91蜜桃传媒精品久久久一区二区| av电影一区二区| 91麻豆国产在线观看| 欧美日韩一区二区三区在线观看免 | 欧美日本一道本在线视频| 欧美视频你懂的| 欧美日韩精品欧美日韩精品一综合 | 亚洲一区尤物| 久久高清免费观看| 久久综合久久久| 欧美性欧美巨大黑白大战| 欧美在线free| 欧美人狂配大交3d怪物一区| 欧美三级电影精品| 91精品国产综合久久久久久久久久| 欧美疯狂性受xxxxx喷水图片| 欧美日韩二区三区| 日韩女优制服丝袜电影| 久久男人中文字幕资源站| 久久久电影一区二区三区| 国产欧美日韩在线看| 中文字幕在线不卡一区| 亚洲三级免费电影| 一区二区免费在线| 日本伊人色综合网| 国产成人午夜视频| 91免费看`日韩一区二区|