电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

自從SpringBoot時(shí)代的到來,去除了Spring的各種繁瑣的XML配置,讓我們可以騰出雙手以便于更加專注的搬磚。記得那時(shí)候剛學(xué)Spring的時(shí)候,每天被Spring的各種XMl配置文件折磨的不行,每引入一個(gè)新的框架,最擔(dān)心的就是jar沖突、哪個(gè)配置文件又配的不對、配置文件沒有起作用。所以每次搭建好一個(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)鍵步驟).

注冊上述的 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里面的配置的對象,通過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。

注冊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ì)有對應(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ò)展的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 酒店厨房设计_中央厨房设计_北京商用厨房设计公司-奇能商厨 | TPM咨询,精益生产管理,5S,6S现场管理培训_华谋咨询公司 | 炒货机-炒菜机-炒酱机-炒米机@霍氏机械| 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 丁基胶边来料加工,医用活塞边角料加工,异戊二烯橡胶边来料加工-河北盛唐橡胶制品有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 包装盒厂家_纸盒印刷_礼品盒定制-济南恒印包装有限公司 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 求是网 - 思想建党 理论强党 | 釜溪印象网络 - Powered by Discuz! | 密集柜_档案密集柜_智能密集架_密集柜厂家_密集架价格-智英伟业 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 济南网站策划设计_自适应网站制作_H5企业网站搭建_济南外贸网站制作公司_锐尚 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 桐城新闻网—桐城市融媒体中心主办 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | RFID电子标签厂家-上海尼太普电子有限公司 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | 24位ADC|8位MCU-芯易德科技有限公司| 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | elisa试剂盒-PCR试剂盒「上海谷研实业有限公司」 | 电动葫芦|防爆钢丝绳电动葫芦|手拉葫芦-保定大力起重葫芦有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 |