Spring
2.5在2.0的基于Schema的Bean配置的基础之上,再增加了扩展XML配置的机制。通过该机制,我们可以编写自己的Schema,并根据自定义的Schema用自定的标签配置Bean。要使用的Spring的扩展XML配置机制,也比较简单,有以下4个步骤:
-
编写自定义Schema文件;
-
编写自定义NamespaceHandler;
-
编写一个或者多个自定义BeanDefinition;
-
在Spring中注册上述组建
下面是一块自定义的Bean配置:
myns:dateformat id=”dateFormat” pattern=”yyyy-MM-dd HH:mm”
lenient=”true” />
与其等价的常规Bean配置为:
<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd HH:mm" />
<property name="lenient" value="true" />
</bean>
为了让Spring能识别这段配置,我们需要按上述的4件事。
编写Schema
对于Schema的内容,可以参见http://www.w3school.com.cn/schema/schema_elements_ref.asp,最终的Schema如下:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/mydateformat" elementFormDefault="qualified">
<import namespace="http://www.springframework.org/schema/beans" />
<element name="dateformat">
<complexType>
<complexContent>
<extension base="beans:identifiedType">
<attribute name="lenient" type="boolean" />
<attribute name="pattern" type="string" use="required" />
</extension>
</complexContent>
</complexType>
</element>
</schema>
编写NamespaceHandler
为了让Spring在解析Bean配置时能识别<myns:dateformat>这个标签,我们需要一个自定义的NamespaceHandler。Spring的NamespaceHandler接口有3个方法:
-
Init():初始化方法,由Spring调用;
- BeanDefinition parse(Element ,ParserContext):由Spring在解析Bean配置文件遇见顶级的(<myns:dateformat>)标签时调用。该方法可以直接在Spring中注册一个Bean Definition,也可以将Bean Definition返回由其他模块去注册;
- BeanDefinition decorate(Node, BeanDefinitionHolder, ParserContext):解析过程中遇见attribute或者嵌套的其他命名空间下的element时调用;
在上述3个方法中,只有init()方法是必须的,而其他两个方法则不是必须的,只有在一些特殊情况下才需要用特殊的方式现实它们。为此,Spring提供了一个NamespaceHandlerSupport类,扩展该类就可以轻易得到我们要的自定义NamespaceHandler。
package com.ronry.springtest.schema;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MyNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
this.registerBeanDefinitionParser("dateformat", new SimpleDateFormatBeanDefinitionParser());
}
}
编写自定义的BeanDefinitionParser
BeanDefinitionParser用来将Bean配置文件解析成相应的BeanDefinition,一般在NamespaceHandler中使用。一般来讲,Bean配置文件,每个顶级的配置元素(例如本例中的<dateformat>)都有一个对应的BeanDefinitionParser。Spring也为自定义BeanDefinitionParser提供了很多支持,再一些抽象类的基础上添加少量功能即可满足大部分需求。
package com.ronry.springtest.schema;
import java.text.SimpleDateFormat;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;
public class SimpleDateFormatBeanDefinitionParser extends
AbstractSingleBeanDefinitionParser {
protected Class<SimpleDateFormat> getBeanClass(Element element){
return SimpleDateFormat.class;
}
protected void doParse(Element element,BeanDefinitionBuilder bean){
String pattern=element.getAttribute("pattern");
bean.addConstructorArgValue(pattern);
String lenient=element.getAttribute("lenient");
bean.addPropertyValue("lenient", Boolean.valueOf(lenient));
}
}
在Spring中注册
有了Schema,有了NamespaceHandler,也有了BeanDefinitionParser,但是只有让Spring知道这些组建的存在,它们才能真正开始工作。为了让Spring能检测到这些组建,只需在META-INF目录下添加两个配置文件(spring.handler和spring.schema)即可。
Spring.handler文件告诉Spring某个name space需要用哪个NamespaceHandler,例如:
http\://www.example.org/mydateformat=com.ronry.springtest.schema.MyNamespaceHandler
|
http://www.example.org/mydateformat要与在Schema中定义的一致。
spring.schema文件,则告诉Spring从哪加载在Bean定义文件中指定的xsd文件,例如:
http\://www.example.org/schema/dateformat.xsd=com/ronry/springtest/schema/dateformat.sd
|
如果没有这个文件,则Spring将会从网络中查找对应的xsd文件。反过来,有了这个文件也就使得xsd文件就必须和对应的代码一起在JAR包中发布了。
完成了以上的工作之后,Spring就能认识我们自定的Bean的配置了。当然,这只是最简单的对spring xml配置的扩展。更复杂的情况的扩展请听下回分解。
分享到:
相关推荐
基于别人的代码:http://www.yihaomen.com/article/java/438.htm ;弄了个maven项目
spring4.0 schema
spring-5.2.9.RELEASE-schema.zip
在官网上下载的spring schema
spring framework 最新版(4.2.1) schema
Spring mvc的说明文档 所有jar包和schema源文件 很全很全
主要介绍了Spring自定义配置Schema可扩展(二)的相关资料,需要的朋友可以参考下
spring-framework-4.2.4.RELEASE-schema
本教程主要介绍如何扩展Spring的xml配置,让Spring能够识别我们自定义的Schema和Annotation,,需要的朋友可以参考下
spring-framework-4.3.4.RELEASE-schema
Spring4.1.5Schema
NULL 博文链接:https://bodu-li.iteye.com/blog/2145400
在使用Spring,写核心配置文件的时候都引入了不一样的约束,这里总结关于spring的XML约束+Schema约束。以后不管是仅使用ioc功能还是aop,把全部的约束引入即可。至于说如何找到这些约束的代码的过程,也在这个文档...
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合...
spring-5.3.14-schema.zip
最新版spring-framework-5.0.1.RELEASE-schema.zip约束
spring-5.3.9-schema.zip
最新版spring-framework-4.3.12.RELEASE-schema.zip约束
spring4.2.0的一些shema约束