日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

關于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

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

自從SpringBoot時代的到來,去除了Spring的各種繁瑣的XML配置,讓我們可以騰出雙手以便于更加專注的搬磚。記得那時候剛學Spring的時候,每天被Spring的各種XMl配置文件折磨的不行,每引入一個新的框架,最擔心的就是jar沖突、哪個配置文件又配的不對、配置文件沒有起作用。所以每次搭建好一個項目就把配置文件用小筆記記錄下來, 方便下次在整合項目的時候直接copy復制就好。下面我們就以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自定義了一套自己的標簽,dubbo:application ,dubbo:registry ,dubbo:protocol,dubbo:service我們心中是不是有點小疑問:這些標簽在Spring項目啟動的時候是如何被Spring管理的?是怎樣被Spring來識別的?如果我們自己隨便定義一個標簽Spring是否能夠識別?我們去翻翻Spring的官網發現這玩意其實就是Spring提供的 XML schema 的擴展支持。只要按照它的步驟來,我們就可以配置任何我們自定義的標簽。XML schema 擴展機制是什么?這個也許好多人沒聽過:

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

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

如何實現一個自定義 XML 擴展

官網有介紹,要實現一個自定義的XML Schema 總共需要4步:

編寫一個 XML schema 文件描述的你節點元素。

編寫一個 NamespaceHandler 的實現類

編寫一個或者多個 BeanDefinitionParser 的實現 (關鍵步驟).

注冊上述的 schema 和 handler。

既然只要按照這四步來,那我們就照著這個文檔來自己實現一個。

Authoring the Schema

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

<?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的地址后面有用到。

這里我們就定義了一個元素application 里面有兩個屬性分別為website和weixin。

編寫一個 NamespaceHandler

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

這個NamespaceHandler 就是將一個 XML 節點解析成 IOC 容器中的一個實體類。也就是說相當于在xml里面的配置的對象,通過Spring ioc 容器管理起來了

編寫 BeanDefinitionParser 的實現類

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

上面在這個實現類只是簡單的做了一個賦值操作,你如果需要有自己的邏輯業務也可以自行來實現。上面還有一個JavajrDomain這個實體類就不貼代碼,就一個簡單的javabean里面包含了兩個屬性weixin和website。

注冊schema組件

最后在resources/META-INF目錄下添加兩個配置文件(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

在這個地方的時候我們其實可以以版本號來進行命名,方便我們可以使用多個不同的版本,Spring-beans 就是這么玩的。

關于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

測試自定義schema

在resources 目錄下新建一個applicationContext.xml文件

關于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

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

編寫一個啟動類

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

我們可以看到控制臺輸出

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

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

Dubbo 中的 XML schema 擴展

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

關于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

SpringBoot的starter

現在有了SpringBoot 之后以前用這個 XML schema配置的框架,大多數都會有對應的starter來進行封裝,starter的使用比起 XML schema的使用還是簡單多了,開箱即用,無需編寫很多的配置文件。如果不是很清楚SpringBoot的starter的推薦去看看這兩篇文章《面試高頻題:springBoot自動裝配的原理你能說出來嗎?》《保姆級教程,手把手教你實現一個SpringBoot的starter》。

總結

雖然現在XML schema 擴展用的不多了,但是應該也還有比較老的項目在使用吧,如果還是比較老的項目,需要引入一個什么樣的框架,我們至少需要知道需要怎么去引入,網上雖然有很多文章可以借鑒,但是我們也應該知其然知其所以然。而不是直接把配置文件單純的copy過來。我們應該知道為啥需要copy這個xsd,為什么沒有這個xsd ,idea不糊識別會報錯。

以上就是關于Spring自定義XML schema 擴展的問題(Spring面試高頻題)的詳細內容,更多關于Spring XML schema 擴展的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜在线播放视频欧美| 精品99久久| 精品视频一区二区三区在线观看 | 久久www成人_看片免费不卡| 日韩精品不卡一区二区| 四虎成人av| 亚洲精品一级二级| 精品国产一区二| 色爱av综合网| 国产精品99免费看| 亚洲综合国产| 亚洲午夜国产成人| 日本伊人午夜精品| 欧美日韩一区二区国产| 久久99国产精品视频| 国产粉嫩在线观看| 国精品一区二区| 激情综合激情| 日韩激情一区二区| 久久精品国产久精国产| 免费高潮视频95在线观看网站| 欧美日韩一二三四| 亚洲高清成人| 日本不卡一二三区黄网| 精品网站aaa| 国产一级一区二区| 国产精品nxnn| 美女久久久久| 麻豆中文一区二区| 丝袜美腿成人在线| 欧美成a人国产精品高清乱码在线观看片在线观看久| 日本不卡免费高清视频在线| 久久国产66| 激情婷婷久久| 日韩中文在线播放| 国产h片在线观看| 精品五月天堂| 视频一区二区中文字幕| 久久精品国产www456c0m| 成人在线免费观看网站| 丝袜亚洲精品中文字幕一区| 国产精品久久观看| 日韩精品三级| 亚洲综合精品四区| 中文av在线全新| 精品国产不卡一区二区| 日韩电影免费网站| 女同性一区二区三区人了人一| 蜜臀a∨国产成人精品| 另类中文字幕国产精品| 国产欧美日韩一级| 日韩精选在线| 国产精品88久久久久久| 日韩在线视频精品| 国产中文字幕一区二区三区| 国产欧美日韩免费观看| 97成人超碰| 日韩av成人高清| 99国产精品| 99久久99久久精品国产片果冰 | 激情91久久| 国产亚洲一卡2卡3卡4卡新区| 日韩综合精品| 午夜亚洲福利| 亚洲国产一区二区在线观看 | 日韩欧美久久| japanese国产精品| 国产在线不卡一区二区三区| 久久国产福利| 91精品久久久久久久久久不卡| 日韩综合一区二区三区| 亚洲一卡久久| 三级欧美在线一区| 国产调教一区二区三区| 日本不卡视频一二三区| 国产欧美综合一区二区三区| 人人爱人人干婷婷丁香亚洲| 亚洲大全视频| 国产专区一区| 久久精品青草| 理论片午夜视频在线观看| 国产成人精品亚洲线观看| 91精品啪在线观看国产18| 亚洲综合三区| 国产精品视频一区二区三区| 亚洲黄色免费看| 亚洲天堂免费| 国产精品欧美三级在线观看| 麻豆视频一区| 国产综合精品一区| av免费不卡国产观看| 欧美一区网站| 蜜臀精品久久久久久蜜臀| 激情视频网站在线播放色| 蜜臀国产一区二区三区在线播放| 国产不卡一区| 日韩av三区| 亚洲v在线看| 中文一区一区三区免费在线观| 99久久99视频只有精品| 丝袜美腿亚洲一区二区图片| 免费污视频在线一区| 亚洲制服一区| 国产精品国产三级国产在线观看| 激情欧美国产欧美| 国产亚洲一级| 中文字幕在线看片| 午夜亚洲精品| 一区二区高清| 国产精品毛片| 欧美日韩精品一区二区三区在线观看| 麻豆成全视频免费观看在线看| 亚洲一区二区三区中文字幕在线观看| 精品中文字幕一区二区三区四区| 麻豆精品新av中文字幕| 日韩激情网站| 亚洲男女自偷自拍| 亚洲精品99| 97久久超碰| 免费视频国产一区| 日本成人一区二区| 国产精品亚洲人成在99www| 奇米亚洲欧美| 四虎成人av| 图片区亚洲欧美小说区| 视频国产精品| 亚洲一区中文| 精品国产18久久久久久二百| 久久精品国语| 日韩视频在线一区二区三区| 91久久在线| 鲁大师成人一区二区三区| 亚洲我射av| 精品国产精品久久一区免费式| 精品国产一区二区三区av片| 久久午夜影院| 国产成人精选| 激情久久久久久| 欧美精品91| 久久99免费视频| 欧美日韩国产在线一区| 日韩激情一二三区| 丝瓜av网站精品一区二区| 四虎国产精品免费观看| 国产韩日影视精品| 99久久精品网| 欧美性感美女一区二区| 国产精品18| 国产欧美高清视频在线| 国产劲爆久久| 欧美国产视频| 久久久久蜜桃| 亚洲高清二区| 欧美日韩精品一区二区视频| 99精品综合| 青青青国产精品| 精品五月天堂| 欧美aa在线观看| 国产视频一区在线观看一区免费| 九色porny丨国产首页在线| 高清精品久久| 久久高清国产| 中文在线免费视频| 日韩专区欧美专区| 国产精品巨作av| 99亚洲视频| 久久精品国产久精国产爱| 91精品一区国产高清在线gif| 亚洲成人二区| 国产免费久久| 一区二区精品伦理...| 国模精品一区| 亚洲三级网站| 欧美在线精品一区| 欧美成人aaa| 日韩精品一卡| 999久久久免费精品国产| 国产资源在线观看入口av| 亚洲精品激情| 久久亚洲国产| 免费看av不卡| 久久久国产精品网站| 色8久久久久| 麻豆精品99| 亚洲精品高潮| 国产精品7m凸凹视频分类| 久久gogo国模啪啪裸体| 亚洲欧美视频| 麻豆精品在线播放| 久久国产亚洲| 9色精品在线| 欧美日韩国产一区精品一区| 高清不卡一区| 国产精品美女| 蜜桃精品在线| 国产情侣一区在线| 蜜芽一区二区三区| 美女视频黄 久久| 欧美精选一区二区三区| 亚洲综合婷婷|