一个简单的自定义标签
<mytag:user id="user" username="test0001" password="test-123456"/>
复制代码
User.class
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
复制代码
META_INF/user.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.void.com/schema/mytag-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="password" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
复制代码
UserBeanDefinitionParser.class
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 password = element.getAttribute("password");
if (StringUtils.hasText(username))
builder.addPropertyValue("username", username);
if (StringUtils.hasText(password))
builder.addPropertyValue("password", password);
}
}
复制代码
可继承 PropertyPlaceholderBeanDefinitionParser 或者 AbstractSingleBeanDefinitionParser。
PropertyPlaceholderBeanDefinitionParser 是 AbstractSingleBeanDefinitionParser 的子类,其中的 doParse 方法中多添加了一些通用的属性设置。
MytagUserNamespaceHandler.class
public class MytagUserNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
}
}
复制代码
META-INF/spring.handlers
www.void.com 可以随意编写
http\://www.void.com/schema/mytag-user=com.debug.selftag.MytagUserNamespaceHandler
复制代码
META-INF/spring.schemas
http\://www.void.com/schema/mytag-user.xsd=META-INF/user.xsd
复制代码
applicationContext.xml
添加两行内容
xmlns:mytag="http://www.void.com/schema/mytag-user"
http://www.void.com/schema/mytag-user http://www.void.com/schema/mytag-user.xsd
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:mytag="http://www.void.com/schema/mytag-user"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.void.com/schema/mytag-user http://www.void.com/schema/mytag-user.xsd">
<mytag:user id="user" username="test0001" password="test-123456"/>
</beans>
复制代码
测试
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
复制代码
输出: User{username='test0001', password='test-123456'}
评论