如何将自定义的配置标签化是个比较通用的问题,spring已经很好的帮我们设计完成,只需要我们去实现。将繁琐的配置通过xml配置,spring自动转换成bean,整个过程比较合理。
1.创建一个需要扩展的组件
package com.bean;
public class User {
private String userName;
private String email;
private String address;
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2.定义一个XSD文件描述组件内容
spring-user.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.lcq.com/schema/user"
xmlns:tns="http://www.lcq.com/schema/user" elementFormDefault="qualified">
<element name="user">
<complexType>
<attribute name="id" type="string" />
<attribute name="userName" type="string" />
<attribute name="email" type="string" />
<attribute name="address" type="string" />
</complexType>
</element>
</schema>
3.实现BeanDefinitionParser接口,解析XSD文件中的定义和组件定义
package com.parse;
import com.bean.User;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
public class UserDefinitionParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return User.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder bean) {
String userName = element.getAttribute("userName");
String email = element.getAttribute("email");
String address = element.getAttribute("address");
if (StringUtils.hasText(userName)) {
bean.addPropertyValue("userName", userName);
}
if (StringUtils.hasText(email)) {
bean.addPropertyValue("email", email);
}
if (StringUtils.hasText(address)) {
bean.addPropertyValue("address", address);
}
}
}
4.创建Handler文件,扩展自NamespaceHandlerSupport,将组件注册到Spring容器
package com.tag;
import com.parse.UserDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class UserNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("user",new UserDefinitionParser());
}
}
5.编写Spring.handlers和Spring.schemas映射文件
spring.handlers
http\://www.lcq.com/schema/user=com.tag.UserNamespaceHandler
Spring.schemas
http\://www.lcq.com/schema/user.xsd=META-INF/spring-user.xsd
6.测试
package com.test;
import com.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("demo.xml");
User user = (User) ac.getBean("userBean");
System.out.println(user.getUserName());
}
}
运行输出lcq