Spring中的自定义标签
程序员文章站
2022-06-09 12:49:27
...
自定义标签目的
- 更好的封装组件
- 增强组件的易用性
自定义组件步骤
- 采用XSD描述自定义标签的元素属性
- 编写Bean定义的解析器
- 注册自定义标签解析器
- 绑定命名空间解析器
自定义标签的第一步是定义标签元素的XML结构,采用XSD描述自定义标签的元素属性,下面以用户服务作为自定义标签,代码如下:
/*userSerivce.xsd*/
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.smart.com/schema/service"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://www.smart.com/schema/service" --1
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:import namespace="http://www.springframework.org/schema/beans"/> --2
<xsd:element name="user-service"> --3
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="dao" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
在1处指定了一个自定义标签的命名空间。在2处导入了spring本身的beans命名空间。在3处定义了一个user-service标签,并且在beans:identifiedType基础上定义了user-service标签的扩展属性“dao”,类似继承方式。
完成标签XSD结构的定义后,接下来编写用户服务标签解析类:
/*UserServiceDefinitionParser*/
package com.dynamic;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
public class UserServiceDefinitionParser implements BeanDefinitionParser {
public BeanDefinition parse(Element element,ParserCopntext parserContext) {
//1、通过BeanDefinitionBuilder创建Bean定义
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserService.class);
//2、获取自定义标签的属性
String dao=element.getAttribute("dao");
beanDefinitionBuilder.addPropertyReference("userDao",dao);
AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
//3、注册Bean定义
parserContext.registerBeanComponent(new BeanComponentDefinition(beanDefinition,"userService"));
return null;
}
}
下一步将UserServiceDefinitionParser解析器注册到Spring命名空间解析器,代码如下:
/*UserServiceNamespaceHandler*/
package com.dynamic;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class UserServiceNamespaceHandler extends NamespaceHandlerSupport{
public void init(){
registerBeanDefinitionParser("user-service",new UserServiceDefinitionParser());
}
}
完成上述步骤后,需要告诉Spring如何解析自定义标签。在源码resources目录创建META-INF文件夹,并在其中创建spring.handlers(告诉spring自定义命名空间所对应的解析器)和spring.schemas(告诉Spring描述自定义标签的文档结构文件所在的位置)两个文件。
使用自定义标签:
<?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:us="...."
xmlns:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/spring-beans-4.0.xsd
..... .....">
<bean id="userDao" class="com.dynamic.UserDao" />
<us:user-service dao="userDao"/> --2
</beans>
首先在beans头部引用自定义标签的命名空间,并设置命名空间前缀“us”,之后可以使用“us”标签定义的组件。
上一篇: python生成词云
下一篇: 计算器代码
推荐阅读