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

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

Spring XML Schema擴展機制的使用示例

瀏覽:6日期:2023-07-12 17:59:07
目錄前言XML Schema擴展XSD配置spring.handlers和spring.schemasNameSpaceHandler與BeanDefinitionParser使用總結前言

在當前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 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 beanBeanDefinitionBuilder 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-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 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擴展機制的使用示例的詳細內容,更多關于Spring XML Schema擴展機制的使用的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 致胜管家软件服务【在线免费体验】 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 无缝方管|无缝矩形管|无缝方矩管|无锡方管厂家 | 炉门刀边腹板,焦化设备配件,焦化焦炉设备_沧州瑞创机械制造有限公司 | 安徽泰科检测科技有限公司【官方网站】 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 鑫达滑石-辽宁鑫达滑石集团 | 2025黄道吉日查询、吉时查询、老黄历查询平台- 黄道吉日查询网 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 浙江皓格药业有限公司| 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 深圳市简易检测技术有限公司| 北京成考网-北京成人高考网 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 大鼠骨髓内皮祖细胞-小鼠神经元-无锡欣润生物科技有限公司 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 算命免费_生辰八字_免费在线算命 - 卜算子算命网 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 河南彩印编织袋,郑州饲料编织袋定制,肥料编织袋加工厂-盛军塑业 河南凯邦机械制造有限公司 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] |