欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring中的自定义标签

程序员文章站 2022-06-09 12:49:27
...

自定义标签目的

  1. 更好的封装组件
  2. 增强组件的易用性

自定义组件步骤

  1. 采用XSD描述自定义标签的元素属性
  2. 编写Bean定义的解析器
  3. 注册自定义标签解析器
  4. 绑定命名空间解析器

自定义标签的第一步是定义标签元素的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生成词云

下一篇: 计算器代码