Spring自定义标签配置大致需要以下步骤:
- 创建一个需要扩展的组件;
- 定义一个XSD文件描述组件内容;
- 创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义;
- 创建一个Handler文件,扩展自NameSpaceHandlerSupport,目的是将组件注册到Spring容器;
- 编写Spring.handlers和Spring.schemas文件;
创建一个需要扩展的组件
package com.maowei.learning.customTag;
public class Person {
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;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("name:");
sb.append(this.name);
sb.append(" age:");
sb.append(this.age);
sb.append('\n');
return sb.toString();
}
}
这跟一般的POJO相比并没有什么特别之处,仅用来接收配置信息。
定义一个XSD文件描述组件内容
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.maowei.com/schema/person"
xmlns:tns="http://www.maowei.com/schema/person"
elementFormDefault="qualified">
<element name="person">
<complexType>
<attribute name="id" type="string"/>
<attribute name="name" type="string"/>
<attribute name="age" type="int"/>
</complexType>
</element>
</schema>
创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义
package com.maowei.learning.customTag;
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 PersonBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
protected Class getBeanClass(Element element){
return Person.class;
}
protected void doParse(Element element, BeanDefinitionBuilder bean){
System.out.println("开始注册BeanDefinition信息");
String name = element.getAttribute("name");
String age = element.getAttribute("age");
if(StringUtils.hasText(name))
bean.addPropertyValue("name", name);
if(StringUtils.hasText(age))
bean.addPropertyValue("age", Integer.valueOf(age));
}
}
创建一个Handler文件,扩展自NameSpaceHandlerSupport,目的是将组件注册到Spring容器
package com.maowei.learning.customTag;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class CustomNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
System.out.println("开始解析自定义命名空间");
registerBeanDefinitionParser("person", new PersonBeanDefinitionParser());
}
}
编写Spring.schemas文件;
http\://www.maowei.com/schema/spring-person.xsd=META-INF/spring-person.xsd
编写Spring.handlers文件
http\://www.maowei.com/schema/person=com.maowei.learning.customTag.CustomNamespaceHandler
测试
配置文件
<?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:myname="http://www.maowei.com/schema/person"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.maowei.com/schema/person
http://www.maowei.com/schema/spring-person.xsd">
<myname:person id="a00001" name="alex" age="15"/>
</beans>
测试类
package com.maowei.learning.customTag;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TagTest {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/spring-tag.xml");
Person p = (Person)ctx.getBean("a00001");
System.out.println(p.toString());
}
}