为什么需要自定义标签?
<tx:annotation-driven transaction-manager="transactionManager" />
如何自定义标签
1.创建一个需要拓展的组件
@Data
public class User {
private String id;
private String username;
private String address;
private int age;
}
2.定义一个XSD文件描述组件内容
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.zhixing.com/schema/user"
xmlns:tns="http://www.zhixing.com/schema/user"
elementFormDefault="qualified">
<element name="user">
<complexType>
<attribute name="id" type="string"/>
<attribute name="username" type="string"/>
<attribute name="address" type="string"/>
<attribute name="age" type="int"/>
</complexType>
</element>
</schema>
- id属性相当于BeanName,组件中可以不定义,但是XSD文件中需要定义
3.实现BeanDefinitionParser,解析XSD文件和组件定义
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 address = element.getAttribute("address");
int age = Integer.parseInt(element.getAttribute("age"));
builder.addPropertyValue("username", username);
builder.addPropertyValue("address", address);
builder.addPropertyValue("age", age);
}
}
4.创建Handler文件,注册组件到容器
public class MyNameSpaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
}
}
5.编写spring.handlers和spring.schemas
http\://www.zhixing.com/schema/user=com.zhixing.parser.MyNameSpaceHandler
http\://www.zhixing.com/schema/user.xsd=META-INF/user.xsd
6.测试自定义标签
<?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.zhixing.com/schema/user"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.zhixing.com/schema/user
http://www.zhixing.com/schema/user.xsd">
<myname:user id="myuser" username="zhangsan" address="nanjing" age="18"/>
</beans>
public class MyParserTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User myUser = (User) applicationContext.getBean("myuser");
System.out.println(myUser);
}
}