`
ronry
  • 浏览: 39269 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring schema

阅读更多

Spring 2.52.0的基于SchemaBean配置的基础之上,再增加了扩展XML配置的机制。通过该机制,我们可以编写自己的Schema,并根据自定义的Schema用自定的标签配置Bean。要使用的Spring的扩展XML配置机制,也比较简单,有以下4个步骤:

 

  1. 编写自定义Schema文件;
  2. 编写自定义NamespaceHandler
  3. 编写一个或者多个自定义BeanDefinition
  4. 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>这个标签,我们需要一个自定义的NamespaceHandlerSpringNamespaceHandler接口有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>)都有一个对应的BeanDefinitionParserSpring也为自定义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.handlerspring.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配置的扩展。更复杂的情况的扩展请听下回分解。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics