Spring中的自定义标签

自定义标签目的

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

自定义组件步骤

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

自定义标签的第一步是定义标签元素的XML结构,采用XSD描述自定义标签的元素属性,下面以用户服务作为自定义标签,代码如下:

/*userSerivce.xsd*/

    
     --2
     --3
        
            
                
                    
                
            
        
    

在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描述自定义标签的文档结构文件所在的位置)两个文件。

使用自定义标签:



    
     --2

首先在beans头部引用自定义标签的命名空间,并设置命名空间前缀“us”,之后可以使用“us”标签定义的组件。

你可能感兴趣的:(spring)