假如我们有一个User类,现在需要通过自定义标签,把这个对象初始化到springApplicationContext中以便于注入使用。
- 新建User类
public class User { private String id; private String userName; private String email; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
- 增加xml定义文件 spring-user.xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.wjs.com/schema/user" targetNamespace="http://www.wjs.com/schema/user" elementFormDefault="qualified"> <xsd:element name="user"> <xsd:complexType> <xsd:attribute name="id" type="xsd:string" /> <xsd:attribute name="userName" type="xsd:string" /> <xsd:attribute name="email" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:schema>
- 定义beanDefiniton类 获取xml中对应定义的属性
import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.util.StringUtils; import org.test.spirng.xml.bean.definition.User; import org.w3c.dom.Element; public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { @Override protected Class<?> getBeanClass(Element element) { return User.class; } @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { String userName = element.getAttribute("userName"); String email = element.getAttribute("email"); if (StringUtils.hasText(userName)) { builder.addPropertyValue("userName", userName); } if (StringUtils.hasText(email)) { builder.addPropertyValue("email", email); } } }
- 定义namespaceHandler 处理xml 中对应的标签
import org.springframework.beans.factory.xml.NamespaceHandlerSupport; public class MyUserNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { registerBeanDefinitionParser("user",new UserBeanDefinitionParser()); } }
- 配置标签对应的处理类spring.handlers
http\://www.wjs.com/schema/user=org.test.spirng.xml.bean.definition.definition.MyUserNamespaceHandler
- 配置标签描述文件 即xsd文件
http\://www.wjs.com/schema/user.xsd=META-INF/spring-user.xsd
- 用法
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:myTag="http://www.wjs.com/schema/user" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.wjs.com/schema/user http://www.wjs.com/schema/user.xsd"> <myTag:user id="testBean" userName="name" email="wjs@163.com"/> <myTag:user id="testBean1" userName="name1" email="wjs@163.com"/> </beans>
整个工程的截图
工程代码见附件。(去掉pom里的parnet标签即可使用)
https://files.cnblogs.com/files/z-test/test-spirng-xml-bean-definition.rar