一、前言
1. 最近在学习dubbo,里边很多如provider、consumer、registry的配置都是通过spring自定义Schema来实现的,为此,我也学习下如何自定义Schema。

2.学习目标
完成自定义一个shema名称为test,节点名为user的例子。
二、准备内容
1.编写java bean
2.编写xsd配置文件
3.编写spring.handlers和spring.schmas
4.编写applicationContext.xml
5.编写NamespaceHandler和BeanDefinitionParser
三、晒代码
1.工程目录结构

2.java bean
1 package com.cnblogs.ericlin.spring;
2
3 public class User {
4 private String id;
5 private String name;
6 private String sex;
7 private int age;
8
9 public String getId() {
10 return id;
11 }
12
13 public void setId(String id) {
14 this.id = id;
15 }
16
17 public String getName() {
18 return name;
19 }
20
21 public void setName(String name) {
22 this.name = name;
23 }
24
25 public String getSex() {
26 return sex;
27 }
28
29 public void setSex(String sex) {
30 this.sex = sex;
31 }
32
33 public int getAge() {
34 return age;
35 }
36
37 public void setAge(int age) {
38 this.age = age;
39 }
40 }
3.xsd文件
1 <?xml version="1.0" encoding="UTF-8" standalone="no" ?> 2 <xsd:schema xmlns="http://www.cnblogs.com/eric-lin/schema/user" 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 4 xmlns:beans="http://www.springframework.org/schema/beans" 5 xmlns:tool="http://www.springframework.org/schema/tool" 6 targetNamespace="http://www.cnblogs.com/eric-lin/schema/user" 7 elementFormDefault="qualified" attributeFormDefault="unqualified"> 8 9 <xsd:import namespace="http://www.springframework.org/schema/beans" /> 10 <xsd:import namespace="http://www.springframework.org/schema/tool" /> 11 12 <xsd:element name="user"> 13 <xsd:complexType> 14 <xsd:complexContent> 15 <xsd:extension base="beans:identifiedType"> 16 <xsd:attribute name="name" type="xsd:string"> 17 <xsd:annotation> 18 <xsd:documentation>姓名</xsd:documentation> 19 </xsd:annotation> 20 </xsd:attribute> 21 22 <xsd:attribute name="sex" type="xsd:string"> 23 <xsd:annotation> 24 <xsd:documentation>性别</xsd:documentation> 25 </xsd:annotation> 26 </xsd:attribute> 27 28 <xsd:attribute name="age" type="xsd:int"> 29 <xsd:annotation> 30 <xsd:documentation>年龄</xsd:documentation> 31 </xsd:annotation> 32 </xsd:attribute> 33 </xsd:extension> 34 </xsd:complexContent> 35 </xsd:complexType> 36 </xsd:element> 37 </xsd:schema>
4.spring.handlers文件内容
http\://www.cnblogs.com/eric-lin/schema/user=com.cnblogs.ericlin.spring.schema.UserNamespaceHandler
5.spring.schemas文件内容
http\://www.cnblogs.com/eric-lin/schema/user/user.xsd=META-INF/user.xsd
6.applicationContext.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:test="http://www.cnblogs.com/eric-lin/schema/user"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.cnblogs.com/eric-lin/schema/user
http://www.cnblogs.com/eric-lin/schema/user/user.xsd">
<test:user id="eric" name="123" sex="male" age="28" />
</beans>
7.NamespaceHandler
package com.cnblogs.ericlin.spring.schema;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class UserNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
}
}
8.BeanDefinitionParser
package com.cnblogs.ericlin.spring.schema;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;
import com.cnblogs.ericlin.spring.User;
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return User.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder bean) {
String id = element.getAttribute("id");
String name = element.getAttribute("name");
String sex = element.getAttribute("sex");
int age = Integer.parseInt(element.getAttribute("age"));
bean.addPropertyValue("id", id);
bean.addPropertyValue("name", name);
bean.addPropertyValue("sex", sex);
bean.addPropertyValue("age", age);
}
}
9测试类
package com.cnglogs.ericlin.spring;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.cnblogs.ericlin.spring.User;
public class TestSpringSchema {
@SuppressWarnings("resource")
@Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
User user = (User) context.getBean("eric");
System.out.println(user.getId());
System.out.println(user.getName());
System.out.println(user.getSex());
System.out.println(user.getAge());
}
}
自此,自定义spring shema例子完成。
源自:https://www.cnblogs.com/eric-lin/p/4968985.html
本文介绍了一个自定义Spring Schema的示例,包括创建JavaBean、编写XSD配置文件、定义Spring处理器及Schema位置等步骤。

被折叠的 条评论
为什么被折叠?



