Spring Schema扩展机制
1:概述
Spring2.0开始,Spring提供XML Schema
可扩展机制,用户可以自定义XML Schema文件,并自定义
XML Bean解析器,集成到Spring IOC容器中。
2:步骤:
创建一个
XML Schema
文件,描述自定义的合法构建模块,也就是xsd文件。自定义处理器类,并实现
NamespaceHandler
接口。自定义一个或者多个解析器,实现
BeanDefinitionParser
接口(关键部分)。注册上面的组建到Spring IOC容器。
3:示例如下:
(1):自定义XML Schema文件
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.liuenyuan.com/schema/myns"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://www.liuenyuan.com/schema/myns"
elementFormDefault="qualified">
<xsd:import namespace="http://www.springframework.org/schema/beans"/>
<xsd:element name="dateFormat">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="pattern" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
自定义targetNamespace
是http://www.liuenyuan.com/schema/myns
,xmlns
与命名空间必须一致。
(2):自定义NamespaceHandler
NamespaceHandler
接口只有三个方法
init()
:在NamespaceHandler
被使用之前调用,完成初始化parse()
:解析元素decorate():嵌套元素时候调用
Spring提供一个默认实现类NamespaceHandlerSupport
,注入每个元素的解析器即可。
用到了代理委托
概念。NamespaceHandlerSupport
可以注册任意个BeanDefinitionParser
,负责所有自定义元素编排,实际XML解析工作委托给各个BeanDefinitioParser
负责。
(3):自定义BeanDefinitionParser
BeanDefinitionParser
将被调用,如果NamespapceHandler
遇到元素类型已经有对应注册的parser(例如上面的handler如果遇到dateformat,DateformatDefinitionParser
会被调用,
解析相应的属性设置到Bean中)将会被调用。BeanDefinitionParser
负责解析一个顶级元素。
Spring提供AbstractSingleBeanDefinitionParser
处理繁重的解析工作。
getBeanClass():返回元素Class类型
doParse():添加元素属性或者构造参数
(4):注册handler和schema
把实现的NamespaceHandler和xsd文件配置到指定的配置文件中。位于META-INF
目录中。
spring.handlers文件包含
xml schema uri
和Handler
类映射关系。
http\://www.liuenyuan.com/schema/myns=\
com.ley.springboot.schema.xml.MynsNamespaceHandler
遇到http\://www.liuenyuan.com/schema/myns
命名空间的时候会交给MynsNamespaceHandler来处理,key部分必须和xsd文件中的targetNamespace
值保持一致
spring.schemas文件包含
xml schema xsd
文件命名空间和文件路径
映射关系。
http\://www.liuenyuan.com/schema/myns.xsd=META-INF/myns.xsd
(5):测试
NamespaceHandler
实现类
public class MynsNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("dateFormat", new MynsBeanDefinitionParser());
}
}
BeaDefinitionParser
实现类
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;
import java.text.SimpleDateFormat;
public class MynsBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return SimpleDateFormat.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder builder) {
String pattern = element.getAttribute("pattern");
builder.addConstructorArgValue(pattern);
}
}
Spring Schema扩展机制的更多相关文章
- 缘起 Dubbo ,讲讲 Spring XML Schema 扩展机制
背景 在 Dubbo 中,可以使用 XML 配置相关信息,也可以用来引入服务或者导出服务.配置完成,启动工程,Spring 会读取配置文件,生成注入 相关 Bean.那 Dubbo 如何实现自定义 X ...
- 聊聊 Spring 的 XML Schema 扩展机制的使用方式
前言 在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的Mybatis.Dubbo等,以及内部封装的各类组件包括 ...
- Spring中自定义Schema扩展机制
一.前言 Spring 为基于 XML 构建的应用提供了一种扩展机制,用于定义和配置 Bean. 它允许使用者编写自定义的 XML bean 解析器,并将解析器本身以及最终定义的 Bean 集成到 S ...
- Spring.factories扩展机制
和Java SPI的扩展机制类似,Spring Boot采用了spring.factories的扩展机制,在很多spring的starter 包中都可以找到,通过在 META-INF/spring.f ...
- 聊聊spring的那些扩展机制
1.背景 慎入:本文将会有大量代码出入. 在看一些框架源码的时候,可以看见他们很多都会和Spring去做结合.举个例子dubbo的配置: 很多人其实配置了也就配置了,没有去过多的思考:为什么这么配置s ...
- dubbo源码之一——xml schema扩展
dubbo源码版本:2.5.4 dubbo-parent |----dubbo-config |----dubbo-config-api |----com.alibaba.dubbo.config.* ...
- spring schema自定义
今天看了一下分布式服务框架的那本书,于是里面提到了spring schema的自定义,于是去简单的了解了一下 参考资源:spring schema扩展: http://www.yihaomen.com ...
- Spring可扩展的XML Schema机制
可扩展的XML Schema机制 从Spring2.0开始,Spring提供了XML Schema可扩展机制,用户可以自定义XML Schema文件,并自定义XML Bean解析器,并集成到Sprin ...
- Spring 的微内核与FactoryBean扩展机制--转载
作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...
随机推荐
- JVM参数调优:Eclipse启动实践
本文主要参考自<深入理解 Java 虚拟机>.这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过程,包括了 JVM(Java ...
- pushbutton成为可点击的图标(实现全透明,不论点击与否都只显示Icon)(也就是一个万能控件)
需求 需要2个按钮,一个是音乐开关,一个是关闭窗口,此文章关闭pushButton的透明问题(hovered+pressed都不会有背景色和边框的变化) 原理 使窗口完全透明 代码 _pPushBut ...
- Bean行为破坏之前,
而在自定义初始化阶段的行为之一似.Spring此外,它提供了两种方法来定制Bean具体的行为破坏之前. 例如下列: 1.采用destroy-method属性. 2.达到DisposableBean介面 ...
- textarea随内容自动增加高度
var autoTextarea = function (elem, extra, maxHeight) { extra = extra || 0; var isFirefox = !!documen ...
- Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)
写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...
- 简明Python3教程 12.问题解决
我们已经探究了python语言的方方面面,现在我们将通过设计编写一个有用的程序将这些内容有机的结合起来. 主要目标是让大家有能力独自编写程序. 问题 我们要解决的问题是”希望编写一个程序,用于创建所有 ...
- js调查server
<script type="text/javascript"> function showUnreadNews() { $(document).ready(functi ...
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...
- Microsoft.AspNet.SignalR实现弹幕(即时通讯)
引用 Microsoft.AspNet.SignalR 服务器 自定义Connection public class BarrageConnection : PersistentConnection ...
- VISTA 与输入法程式介面
原文:VISTA 与输入法程式介面 VISTA 与输入法程式介面 文/黄忠成 近日,我所兼职顾问的公司开始将旧有的Win32 程式及新开发的.NET 应用程式移转到VISTA 系 ...