編寫測試實體類
public class Hero {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
複製程式碼
定義xsd檔案
檔案命名為hero.xsd放在resources/META-INF/下面
<xsd:schema
xmlns="http://www.ye.com/schema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ye.com/schema">
<xsd:complexType name="elementname1complexType">
<xsd:attribute name="name" type="xsd:string">
<xsd:annotation>
<xsd:documentation><![CDATA[ The elementname1 name. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="age" type="xsd:int">
<xsd:annotation>
<xsd:documentation><![CDATA[ The elementname1 age. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
<xsd:element name="elementname1" type="elementname1complexType">
<xsd:annotation>
<xsd:documentation><![CDATA[ elementname1的文件 ]]></xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:schema>
複製程式碼
1. 定義targetNamespace(目標名稱空間),xmlns的值要與這個相同 2. xsd:element定義的就是將來會在xml檔案中用到的元素,例如中的application 3. xsd:attribute定義的就是模型類中的屬性,例如中的name,並且可以指定屬性型別,進而起到檢測的作用(當我們定義的是int,如果在xml中的值是非int型的,直接會報錯)
編寫spring.schemas檔案
放在resources/META-INF/下
http\://www.ye.com/schema/hero.xsd=META-INF/hero.xsd
複製程式碼
編寫BeanDefinition解析器
作用:主要用來解析自定義的xml標籤。
public class HeroBeanDefinitionParser implements BeanDefinitionParser{
private final Class<?> beanClass;
public HeroBeanDefinitionParser(Class<?> beanClass) {
this.beanClass = beanClass;
}
@Override
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;
}
}
複製程式碼
編寫名稱空間處理器
public class HeroNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("elementname1", new HeroBeanDefinitionParser(Hero.class));
}
}
複製程式碼
說明:通常為每一個xsd:element都要註冊一個BeanDefinitionParser。
編寫spring.handlers檔案
放在resources/META-INF/下
http\://www.ye.com/schema=com.ye.xml.HeroNamespaceHandler
複製程式碼
編寫hero.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:hero="http://www.ye.com/schema"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.ye.com/schema http://www.ye.com/schema/hero.xsd">
<hero:elementname1 name="xiaona" age="18"/>
</beans>
複製程式碼
編寫測試類
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("hero.xml");
Hero hero = (Hero) applicationContext.getBean(Hero.class.getName());
System.out.println("name: " + hero.getName() + " age: " + hero.getAge());
}
}
複製程式碼