基于Spring可扩展Schema提供自定义配置支持

spring 可以基于schema 扩展,自定义 schema。参考文档自己搭了个应用试验了一下:

 


首先看下自己写的 myns.xsd

 

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <xsd:schema xmlns="http://www.yjhexy.com/schema/myns"  
  3.     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"  
  4.     targetNamespace="http://www.yjhexy.com/schema/myns" elementFormDefault="qualified"  
  5.     attributeFormDefault="unqualified">  
  6.   
  7.     <xsd:import namespace="http://www.springframework.org/schema/beans" />  
  8.   
  9.     <xsd:element name="dateformat">  
  10.         <xsd:complexType>  
  11.             <xsd:complexContent>  
  12.                 <xsd:extension base="beans:identifiedType">  
  13.                     <xsd:attribute name="lenient" type="xsd:boolean" />  
  14.                     <xsd:attribute name="pattern" type="xsd:string" use="required" />  
  15.                 </xsd:extension>  
  16.             </xsd:complexContent>  
  17.         </xsd:complexType>  
  18.     </xsd:element>  
  19.   
  20. </xsd:schema>  

 

然后看下我的applicationContxt.xml配置:

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:myns="http://www.yjhexy.com/schema/myns"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  6.     http://www.yjhexy.com/schema/myns http://www.yjhexy.com/schema/myns/myns.xsd  
  7.     ">  
  8.   
  9.     <myns:dateformat id="dateFormat" pattern="yyyy-MM-dd HH:mm"  
  10.         lenient="true" />  
  11.   
  12. </beans>  

很明显实现了个自定义的bean ,这个bean有两个属性,一个是时间的格式,另外一个不知道啥东西。

 

然后在META-INF下面写了两个文件,

spring.handlers:用来描述如何处理自定义的namespace

 

Xml代码  收藏代码
  1. http\://www.yjhexy.com/schema/myns=com.yajun.balance.spring.MyNamespaceHandler  

 spring.schemas:描述schema的位置

 

Xml代码  收藏代码
  1. http\://www.yjhexy.com/schema/myns/myns.xsd=com/yajun/balance/spring/myns.xsd  

 

然后是需要两个类,一个处理namespace,一个处理beanDefinition

 

 

Java代码  收藏代码
  1. package com.yajun.balance.spring;  
  2.   
  3. import org.springframework.beans.factory.xml.NamespaceHandlerSupport;  
  4.   
  5. public class MyNamespaceHandler extends NamespaceHandlerSupport {  
  6.   
  7.     public void init() {  
  8.         registerBeanDefinitionParser("dateformat"new SimpleDateFormatBeanDefinitionParser());  
  9.     }  
  10.   
  11. }  
 

 

 

Java代码  收藏代码
  1. package com.yajun.balance.spring;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4.   
  5. import org.springframework.beans.factory.support.BeanDefinitionBuilder;  
  6. import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;  
  7. import org.springframework.util.StringUtils;  
  8. import org.w3c.dom.Element;  
  9.   
  10. public class SimpleDateFormatBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {  
  11.   
  12.     protected Class getBeanClass(Element element) {  
  13.         return SimpleDateFormat.class;  
  14.     }  
  15.   
  16.     protected void doParse(Element element, BeanDefinitionBuilder bean) {  
  17.         // this will never be null since the schema explicitly requires that a value be supplied  
  18.         String pattern = element.getAttribute("pattern");  
  19.         bean.addConstructorArgValue(pattern);  
  20.   
  21.         // this however is an optional property  
  22.         String lenient = element.getAttribute("lenient");  
  23.         if (StringUtils.hasText(lenient)) {  
  24.             bean.addPropertyValue("lenient", Boolean.valueOf(lenient));  
  25.         }  
  26.     }  
  27. }  

 

最后main输出试试:

 

Java代码  收藏代码
  1. package com.yajun.balance.spring;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4.   
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. public class MainTest {  
  9.   
  10.     public static void main(String[] args) {  
  11.         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
  12.         SimpleDateFormat f = (SimpleDateFormat) ctx.getBean("dateFormat");  
  13.         System.out.println(f);  
  14.     }  
  15. }  
阅读更多
上一篇多线程编程-减少上下文切换(1)
下一篇终止线程的方法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭