spring 解析自定义xml

本篇文章讲解spring是如何解析自定义xml配置的,主要步骤如下

#1 编写xml文件

<?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://baiwan.com/schema"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://baiwan.com/schema http://baiwan.com/schema/book.xsd">
    <tag:modelname name="yanyan" age="18"/>
</beans>
复制代码

#2 对应的bean

public class Book {
    private String id;
    private String name;
    private Integer age;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    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;
    }

}
复制代码

#3 xsd

<xsd:schema
    xmlns="http://baiwan.com/schema"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://baiwan.com/schema">
    <xsd:complexType name="beanname">


        <xsd:attribute name="name" type="xsd:string"></xsd:attribute>

        <xsd:attribute name="age" type="xsd:int"></xsd:attribute>

    </xsd:complexType>

    <xsd:element name="modelname" type="beanname">
        <xsd:annotation>
            <xsd:documentation><![CDATA[ elementname1的文档 ]]></xsd:documentation>
        </xsd:annotation>
    </xsd:element>
</xsd:schema>
复制代码

#4注册和解析

public class BookNamespaceHandler extends NamespaceHandlerSupport {
    public void init() {
        registerBeanDefinitionParser("modelname", new BookBeanDefinitionParser(Book.class));
    }
}
public class BookBeanDefinitionParser implements BeanDefinitionParser {
    private final Class<?> beanClass;

    public BookBeanDefinitionParser(Class<?> beanClass) {
        this.beanClass = beanClass;
    }

    public BeanDefinition parse(Element element, ParserContext parserContext) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(beanClass);
        beanDefinition.setLazyInit(false);
        beanDefinition.getPropertyValues().add("name", element.getAttribute("name"));
        beanDefinition.getPropertyValues().add("age", element.getAttribute("age"));
        BeanDefinitionRegistry beanDefinitionRegistry = parserContext.getRegistry();
        beanDefinitionRegistry.registerBeanDefinition(beanClass.getName(),beanDefinition);//注册bean到BeanDefinitionRegistry中
        return beanDefinition;
    }
}

复制代码

#5把上述文件关联起来

spring.schemas
http\://baiwan.com/schema=com.baiwan.springxml.schema.BookNamespaceHandler

spring.handlers 
http\://baiwan.com/schema/book.xsd=META-INF/book.xsd
复制代码

#6测试运行下

public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("book.xml");
        Book book = (Book) applicationContext.getBean(Book.class.getName());
        System.out.println("name: " + book.getName() + " age: " + book.getAge());
    }
复制代码

转载于:https://juejin.im/post/5a22c6436fb9a0450002dd96

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值