Spring自定义标签流程:
1、写个bean-->User
package fun.huanghai.bean; public class User { private String userName; private String email; 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; } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + ", email='" + email + '\'' + '}'; } }
2、写个xsd文件-->Spring-test.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.lexueba.com/schema/user"
xmlns:tns="http://www.lexueba.com/schema/user"
elementFormDefault="qualified">
<element name="user">
<complexType>
<attribute id="id" name="id" type="string"/>
<attribute id="userName" name="userName" type="string"/>
<attribute id="email" name="email" type="string"/>
</complexType>
</element>
</schema>
3、写个类继承AbstractSingleBeanDefinitionParser
package fun.huanghai.config;
import fun.huanghai.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 UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
//Element对应的类
protected Class getBeanClass(Element element){
return User.class;
}
//从element中解析并提取对应的元素
@Override
protected void doParse(Element element, BeanDefinitionBuilder bean) {
String userName = element.getAttribute("userName");
String email = element.getAttribute("email");
//将提取的数据放入到BeanDefinitionBuilder中,待到完成所有bean的解析后统一注册到beanFactory中
if(StringUtils.hasText(userName)){
bean.addPropertyValue("userName",userName);
}
if(StringUtils.hasText("email")){
bean.addPropertyValue("email",email);
}
}
}
4、写个类继承NamespaceHandlerSupport 重写init() 方法
package fun.huanghai.config;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MyNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("user",new UserBeanDefinitionParser());
}
}
5、在工程目录下META-INF下写两个文件
--> Spring.handlers
http\://www.lexueba.com/schema/user=fun.huanghai.config.MyNamespaceHandler
--> Spring.schemas
http\://www.lexueba.com/schema/user.xsd=META-INF/Spring-test.xsd
6、在spring.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:myname="http://www.lexueba.com/schema/user" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.lexueba.com/schema/user http://www.lexueba.com/schema/user.xsd"> <myname:user id="testbean" userName="aaa" email="bbb" /> </beans>
7、主程序运行
package fun.huanghai; import fun.huanghai.bean.User; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Application { public static void main(String[] args){ ApplicationContext application = new ClassPathXmlApplicationContext("classpath:spring.xml"); User user = (User) application.getBean("testbean"); System.out.println(user); } }
8、运行结果: