内容简介:原文地址:从Spring 2.0版本开始,Spring提供了XML Schema可扩展机制,用于定义和配置Bean。完成XML自定义扩展,需要下面几个步骤:按照上面的步骤,实现如下可扩展XML元素:
原文地址: www.jianshu.com/p/8639e5e9f…
从Spring 2.0版本开始,Spring提供了XML Schema可扩展机制,用于定义和配置Bean。完成XML自定义扩展,需要下面几个步骤:
NamespaceHandler BeanDefinitionParser
按照上面的步骤,实现如下可扩展XML元素:
<myns:dateformat id="dateFormat" pattern="yyyy-MM-dd HH:mm" lenient="true"/> 复制代码
等价于
<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-HH-dd HH:mm"/>
<property name="lenient" value="true"/>
</bean>
复制代码
1.自定义 XML Schema 文件
<!-- myns.xsd (inside package org/springframework/samples/xml) -->
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.mycompany.com/schema/myns"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://www.mycompany.com/schema/myns"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<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="lenient" type="xsd:boolean"/>
<xsd:attribute name="pattern" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
复制代码
2.自定义NamespaceHandler
NamespacespaceHandler
用于解析配置文件时遇到的特定命名空间的所有元素。在我们的例子中, NamespaceHandler
应该处理 myns:dateformat
元素的解析。
NamespaceHandler
提供如下三个方法:
init() BeanDefinition parse(Element, ParserContext) BeanDefinition decorate(Node,BeanDefinitionHandler,ParserContext)
Spring提供了一个默认的实现类 NamespaceHandlerSupport
,我们只需要在init的时候注册每个元素的解析器即可。
public class DateformatNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("dateformat", new DeteformatDefinitionParser());
}
}
复制代码
这里实际用到了代理委托的概念, NamespaceHandlerSupport
可以注册任意个 BeanDefinitionParser
。 NamespaceHandlerSupport
负责所有自定义元素的编排,而解析XML的工作委托给各个 BeanDefinitionParser
负责。
3.自定义BeanDefinitionParser
如果 NamespapceHandler
遇到元素类型(如: dateformat
)已经有对应注册的parser,则 DateformatDefinitionParser
会被调用,解析相应的属性设置到Bean中。BeanDefinitionParser负责解析一个顶级元素。
Spring提供了 AbstractSingleBeanDefinitionParser
来处理繁重的解析工作,只需要实现两个方法:
Class<?> getBeanClass(Element) void doParse(Element element,BeanDefinitionBuilder builder)
ppackage org.springframework.samples.xml;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
import java.text.SimpleDateFormat;
public class SimpleDateFormatBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
protected Class getBeanClass(Element element) {
return SimpleDateFormat.class;
}
protected void doParse(Element element, BeanDefinitionBuilder bean) {
// this will never be null since the schema explicitly requires that a value be supplied
String pattern = element.getAttribute("pattern");
bean.addConstructorArg(pattern);
// this however is an optional property
String lenient = element.getAttribute("lenient");
if (StringUtils.hasText(lenient)) {
bean.addPropertyValue("lenient", Boolean.valueOf(lenient));
}
}
}
复制代码
4.注册handler和schema
为了让Spring在解析xml的时候能够感知到我们的自定义元素,我们需要把 NamespaceHandler
和 xsd文件
放到2个指定的配置文件中,这2个文件都位于 META-INF
目录中
-
'META-INF/spring.handlers':包含XML Schema URI到命名空间处理程序类的映射。因此,对于我们的示例,我们需要编写以下内容:http\://www.mycompany.com/schema/myns=org.springframework.samples.xml.DateformatNamespaceHandler 复制代码
-
META-INF/spring.schemas:包含XML Schema xsd到类路径资源的映射。http\://www.mycompany.com/schema/myns/myns.xsd=org/springframework/samples/xml/myns.xsd 复制代码
5.在Spring XML配置中使用自定义扩展
<?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:myns="http://www.mycompany.com/schema/myns"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.mycompany.com/schema/myns http://www.mycompany.com/schema/myns/myns.xsd">
<!-- as a top-level bean -->
<myns:dateformat id="defaultDateFormat" pattern="yyyy-MM-dd HH:mm" lenient="true"/>
<bean id="jobDetailTemplate" abstract="true">
<property name="dateFormat">
<!-- as an inner bean -->
<myns:dateformat pattern="HH:mm MM-dd-yyyy"/>
</property>
</bean>
</beans>
复制代码
以上所述就是小编给大家介绍的《Spring系列-XML schema扩展机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Kubernetes资源扩展机制(二)
- 喧喧发布 1.6.0 版本,扩展机制增强,支持服务器扩展
- 优秀开源框架的扩展机制实现
- 聊聊 Spring 中的那些扩展机制
- 浅析Dubbo的SPI扩展机制
- 图解kubernetes资源扩展机制实现(上)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大规模Web服务开发技术
伊藤直也、田中慎司 / 李剑 / 电子工业出版社 / 2011-7 / 59.00元
Hatena是日本最大的Web服务提供商之一,它提供的服务包括关键字(类似于维基百科)、博客、相册等。《大规模Web服务开发技术》由伊藤直也、田中慎司所著,内容主要来自Hatena为学生们举行的暑期实习的课程,内容涵盖广泛,介绍了性能优化、分布式、算法、系统架构等各个方面,甚至还介绍了硬件的经济成本,是运维工程师们必不可少的参考书。书中还包括几个算法实习课题,介绍了压缩算法、全文搜索等算法的实现方......一起来看看 《大规模Web服务开发技术》 这本书的介绍吧!