spring 扩展xml标签

348 阅读1分钟

spring 扩展xml标签

1、定义配置属性javabean
public class Person {

    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
2、提供一个xsd文件
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns="http://soft1010.com/schema/demo"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:beans="http://www.springframework.org/schema/beans"
            targetNamespace="http://soft1010.com/schema/demo"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified">

    <xsd:import namespace="http://www.springframework.org/schema/beans" />

    <xsd:element name="person">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="name" type="xsd:string" use="required" />
                    <xsd:attribute name="age" type="xsd:integer" use="required" />
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>
3、编写NamespaceHandler和BeanDefinitionParser完成解析工作
public class PersonBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {


    @Override
    protected Class<?> getBeanClass(Element element) {
        return Person.class;
    }

    @Override
    protected void doParse(Element element, BeanDefinitionBuilder builder) {
        builder.addPropertyValue("name",element.getAttribute("name"));
        builder.addPropertyValue("age",element.getAttribute("age"));
        super.doParse(element, builder);
    }
}
public class PersonNamespaceHandlerSupport extends NamespaceHandlerSupport {

    @Override
    public void init() {
        registerBeanDefinitionParser("person",new PersonBeanDefinitionParser());
    }
}
4、编写spring.handlers和spring.schemas串联起所有部件
http://soft1010.com/schema/demo=com.soft1010.xml.schema.spring.PersonNamespaceHandlerSupport
http://soft1010.com/schema/demo/Person.xsd=META-INF/Person.xsd
5、应用
public class Test {
    private static ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            "spring.xml");

    public static void main(String args[]){
        Person person= (Person)context.getBean("person");
        System.out.println(person.toString());
    }
}

注解的盛行,xml已经很少使用了,实用性很低了,放在这里供大家玩赏