Spring2.0 可扩展XML配置初探
Spring 2.0版本支持扩展XML配置,着实兴奋了一下,在我看来,Spring作为目前最流行的框架,不能扩展用户自定义的配置,实在是Spring的一个很不爽的地方,<bean />的方式用起来比较通用,起码到目前为止符合大部分人的使用习惯,并且能完成Spring所有的配置操作,但是对于第三方的提供商或则会经常扩展Spring功能的开发者来说,使用<bean />这样的配置方式或许不是他们最想要的,他们需要使组件的配置更加直观、易阅读、易扩展……试想使用下面的配置方式
<mytag:datasource id="datasource" databaseType="oracle" ip="192.168.1.110" port="1521" databaseName="myDB" userName="admin" password="password" /><mytag:ehCache id="ehcache" cache="true" maxElements="100000" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
package com.mysite.tag;public class One {private String age;public One(){}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}
<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns="http://www.mysite.org/schema/mytag"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:beans="http://www.springframework.org/schema/beans"targetNamespace="http://www.mysite.org/schema/mytag"elementFormDefault="qualified"attributeFormDefault="unqualified"><xsd:import namespace="http://www.springframework.org/schema/beans"/><xsd:element name="one"><xsd:complexType><xsd:complexContent><xsd:extension base="beans:identifiedType"><xsd:attribute name="age" type="xsd:string" default="99999"/></xsd:extension></xsd:complexContent></xsd:complexType></xsd:element></xsd:schema>
package com.mysite.tag;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.beans.factory.config.BeanDefinitionHolder;import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;import org.springframework.beans.factory.support.RootBeanDefinition;import org.springframework.beans.factory.xml.BeanDefinitionParser;import org.springframework.beans.factory.xml.ParserContext;import org.w3c.dom.Element;public class MyBeanDefinitionParser implements BeanDefinitionParser{public BeanDefinition parse(Element arg0, ParserContext arg1) {RootBeanDefinition def = new RootBeanDefinition(); //设置Bean Classdef.setBeanClass(One.class); //注册ID属性String id = arg0.getAttribute("id");BeanDefinitionHolder idHolder= new BeanDefinitionHolder(def,id);BeanDefinitionReaderUtils.registerBeanDefinition(idHolder, arg1.getRegistry()); //注册age属性String age = arg0.getAttribute("age");BeanDefinitionHolder ageHolder= new BeanDefinitionHolder(def,age);BeanDefinitionReaderUtils.registerBeanDefinition(ageHolder, arg1.getRegistry());def.getPropertyValues().addPropertyValue("age", age);return def;}}
def.getPropertyValues().addPropertyValue("age", age);
package com.mysite.tag;import org.springframework.beans.factory.xml.NamespaceHandlerSupport;public class MyNameSpaceHandler extends NamespaceHandlerSupport {public void init() { registerBeanDefinitionParser("one",new MyBeanDefinitionParser());}}
http\://www.mysite.org/schema/mytag.xsd=com/mysite/tag/mytag.xsd
http\://www.mysite.org/schema/mytag=com.mysite.tag.MyNameSpaceHandler
<?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:tag="http://www.mysite.org/schema/mytag"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://www.mysite.org/schema/mytaghttp://www.mysite.org/schema/mytag.xsd"><tag:one id="oneBean" age="99"/></beans>
<tag:one id="oneBean" age="99"/>
package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.mysite.tag.One;public class Main {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");One tag = (One) ctx.getBean("oneBean");System.out.println("oneBean age is "+tag.getAge());}}
oneBean age is 99
<XXCompany:XXXModule id="">......