一、自定义实现

1)spring.handlers 定义处理类位置
http\://www.huang.com/schema/user=com.handler.MyNamespaceHandler
2)spring.schemas 定义标签验证XSD位置
http\://www.huang.com/schema/user.xsd=META-INF/user.xsd
3)user.xsd
<?xml version="1.0" encoding="utf-8" ?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.huang.com/schema/user" xmlns:tns="http://www.huang.com/schema/user" elementFormDefault="qualified"> <element name="user"> <complexType> <attribute name="id" type="string"/><!-- 必须要有,否则无法创建bean--> <attribute name="name" type="string"/> <attribute name="address" type="string"/> </complexType> </element> </schema>
4) user.java
public class User {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
5)MyNamespaceHandler.java 映射处理类
public class MyNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
//可以是多个
registerBeanDefinitionParser("user",new UserBeanDefinitionParser());
}
}
6)UserBeanDefinitionParser.java
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return User.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder builder) {
String name = element.getAttribute("name");
String address=element.getAttribute("address");
if(StringUtils.hasText(name)){
builder.addPropertyValue("name",name);
}
if(StringUtils.hasText(address)){
builder.addPropertyValue("address",address);
}
}
}
7)test.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:huang="http://www.huang.com/schema/user"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.huang.com/schema/user
http://www.huang.com/schema/user.xsd">
<huang:user id="user" name="huang" address="天庭58栋"/>
</beans>
8)完成,使用
二、解析过程
1)在上一章解释了整体创建过程,其中在创建BeanFactory完成,会调用loadBeanDefinitions()

2)创建XmlBeanDefinitionReader类并加载指定路径下的文件text.xml,验证xml格式调用getValidationModeForResource()利用spring.schema和use.xsd完成XSD的验证工作并将xml文件解析成Document对象,调用registerBeanDefinitions()方法将document解析成BeanDefinition对象

3)调用registerBeanDefinitions()创建默认解析器DefaultNamespaceHandlerResolver,只能Beans.xsd中定义的


4)如果标签非beans.xsd下的将走delegate.parseCustomElement,调用getNamespaceHandlerResolver().resolve(),自动扫描所有的META-INF/spring.handlers,并匹配到合适的NamespaceHandler

5)在通过"use"找到解析器MyBeanDefinitionParser,开始处理标签将元素放入BeanDefinition中
浙公网安备 33010602011771号