本篇文章讲解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());
}
复制代码