Spring IOC源码篇七 核心方法obtainFreshBeanFactory自定义标签
Spring扩展点-自定义XML标签
- 1.XML标签解析流程回顾
- 2.自定义标签流程
- 3.编写标签类
- 4.编写标签NamespaceHandler类
- 5.编写标签解析BeanDefinitionParser类
- 6.在resources目录下创建META-INF目录
- 7.META-INF目录下创建自定义标签XSD文件(约束自定义标签)
- 8.META-INF目录下创建spring.schemas文件(定义schemaLocation与XSD文件映射)
- 9.META-INF目录下创建spring.handlers文件(定义namespace与NamespaceHandler映射)
- 10.编写bean定义配置类
- 11.编写测试类
- 12.测试结果(打完收工)
1.XML标签解析流程回顾
1.获取标签namespace URI
2.加载META-INFO下spring.handlers文件中定义的namespace与NamespaceHandler映射关系
3.根据namespace URI获取对应NamespaceHandler类
4.实例化对应NamespaceHandler
5.调用NamespaceHandler.init方法
6.在NamespaceHandler.init方法中注册对应标签的解析器BeanDefinitionParser
7.调用对应的解析器解析对应的标签
8.将解析得到的BeanDefinition注册到容器中
2.自定义标签流程
1.编写标签类
2.编写标签NamespaceHandler类
3.编写标签解析BeanDefinitionParser类
4.在resources目录下创建META-INF目录
5.META-INF目录下创建自定义标签XSD文件(约束自定义标签)
6.META-INF目录下创建spring.schemas文件(定义schemaLocation与XSD文件映射)
7.META-INF目录下创建spring.handlers文件(定义namespace与NamespaceHandler映射)
8.编写bean定义配置类
9.编写测试类
3.编写标签类
public class User {private String username;private String phone;private String address;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}
4.编写标签NamespaceHandler类
public class UserNamespaceHandler extends NamespaceHandlerSupport {@Overridepublic void init() {registerBeanDefinitionParser("user", new UserBeanDefinitionParser());}
}
5.编写标签解析BeanDefinitionParser类
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {@Overrideprotected Class<?> getBeanClass(Element element) {return User.class;}@Overrideprotected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {String username = element.getAttribute("username");String phone = element.getAttribute("phone");String address = element.getAttribute("address");if(StrUtil.isNotEmpty(username)){builder.addPropertyValue("username", username);}if(StrUtil.isNotEmpty(phone)){builder.addPropertyValue("phone", phone);}if(StrUtil.isNotEmpty(address)){builder.addPropertyValue("address", address);}}
}
6.在resources目录下创建META-INF目录
7.META-INF目录下创建自定义标签XSD文件(约束自定义标签)
<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:tns="http://www.yuriy.com/schema/tag"targetNamespace="http://www.yuriy.com/schema/tag"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="phone" type="xsd:string"/><xsd:attribute name="address" type="xsd:string"/></xsd:complexType></xsd:element>
</xsd:schema>
8.META-INF目录下创建spring.schemas文件(定义schemaLocation与XSD文件映射)
http\://www.yuriy.com/schema/tag/user.xsd=META-INF/user.xsd
9.META-INF目录下创建spring.handlers文件(定义namespace与NamespaceHandler映射)
http\://www.yuriy.com/schema/tag=com.sctelcp.bigdata.spring.tag.UserNamespaceHandler
10.编写bean定义配置类
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:model="http://www.yuriy.com/schema/tag"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.yuriy.com/schema/taghttp://www.yuriy.com/schema/tag/user.xsd"><model:user id="1" username="root" phone="123456" address="四川省成都市龙泉驿区大面镇"/>
</beans>
11.编写测试类
public class Main {/**** @param args*/public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("application-beans.xml");User user = context.getBean(User.class);System.out.println(user.getAddress());}
}