Spring的自定义标签

当Spring拿到一个元素时首先要做的是根据命名空间进行解析,如果是默认的命名空间,则使用parseDefaultElement方法进行元素解析,否则使用parseCustom Element方法进行解析。

    protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
        if (delegate.isDefaultNamespace(root)) {
            NodeList nl = root.getChildNodes();
            for (int i = 0; i < nl.getLength(); i++) {
                Node node = nl.item(i);
                if (node instanceof Element) {
                    Element ele = (Element) node;
                    if (delegate.isDefaultNamespace(ele)) {
                        parseDefaultElement(ele, delegate);
                    }
                    else {
                        delegate.parseCustomElement(ele);
                    }
                }
            }
        }
        else {
            delegate.parseCustomElement(root);
        }
    }

    public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
        String namespaceUri = getNamespaceURI(ele);
        NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
        if (handler == null) {
            error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
            return null;
        }
        return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
    }

自定义标签的使用

扩展Spring自定义标签配置大致需要以下几个步骤(前提是要把Spring的Core包加入项目中)。

  1. 创建一个需要扩展的组件。
  2. 定义一个XSD文件描述组件内容。
  3. 创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义。
  4. 创建一个Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器。
  5. 编写Spring.handlers和Spring.schemas文件。

现在我们就按照上面的步骤一步步地体验自定义标签的过程。

第一步:

public class TestBean {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "TestBean{" +
                "name=‘" + name + ‘\‘‘ +
                ‘}‘;
    }
}

第二步:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://code.alibabatech.com/schema/dubbo"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://code.alibabatech.com/schema/dubbo">  

        <xsd:element name="custom" type="customType">
        </xsd:element>
        <xsd:complexType name="customType">
                <xsd:attribute name="id" type="xsd:ID">
                </xsd:attribute>
                <xsd:attribute name="name" type="xsd:string">
                </xsd:attribute>
        </xsd:complexType>  

</xsd:schema> 

第三步:

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;  

public class TestCustomBeanDefinitionParser implements BeanDefinitionParser {  

    public BeanDefinition parse(Element element, ParserContext parserContext) {  

        String id = element.getAttribute("id");
        String name = element.getAttribute("name");  

        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(TestBean.class);
        beanDefinition.getPropertyValues().addPropertyValue("name", name);
        parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);  

        return beanDefinition;
    }
}  

第四步:

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class TestNamespaceHandler extends NamespaceHandlerSupport {
    public void init() {
        registerBeanDefinitionParser("custom", new TestCustomBeanDefinitionParser());
    }
}  

第五步:

spring.handlers:
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
spring.schemas:
http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd

第六步:

<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

        <dubbo:custom id="testCustom" name="this is a test custom tag" />
</beans>  

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;  

public class Main {  

    public static void main(String[] args) {
        String xml = "classpath:test.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { xml });
        System.out.println(context.getBean("testCustom"));
    }
}  

上例输出为:
TestBean {name=this is a test custom tag}
时间: 2024-10-05 07:25:14

Spring的自定义标签的相关文章

基于Spring开发——自定义标签及其解析

1. XML Schema 1.1 最简单的标签 一个最简单的标签,形式如: <bf:head-routing key="1" value="1" to="test2"/> 该标签只包含了若干属性,我们就在xsd文件中这么定义 <!-- 声明一个标签,名字为head-routing,他的类型为headRouting--> <xsd:element name="head-routing" type=

Spring MVC 自定义标签如何使用@Autowired自动装配注解

在用Spring MVC框架做Web应用开发中,在一些特殊请款下我们都会用自定标签来完成一些特殊的功能. 在通常情况下,自定义标签的内容如果不通过访问服务就能实现,那么继承TagSupport,重写doStartTag()方法就可以实现基本功能. eg. 实现一个html标记的反转义功能的自定义标签 /** * @Comment * @Author Ron * @date 2016年8月30日 上午9:02:56 */ public class HtmlUnEncodeTags extends

Spring——使用自定义标签

文章内容参考了<Spring源码深度解析>一书.自己照着书中内容做了一遍,不懂的地方以及采坑的地方会在文中记录. 推荐一篇post,关于Spring配置文件的命名空间: https://www.cnblogs.com/gonjan-blog/p/6637106.html 我们暂时只是知道使用Spring的常规标签,加个bean,事务,Aop等等.随着满足业务的需求,同时降低程序员的工作量,我们有时需要自己定制一些标签.话补多少,下面进入主题. 自定义标签的使用 扩展Spring自定义标签大致需

Spring 源码分析(四)--自定义标签的使用

在之前的代码分析中,Spring标签的解析分为 默认标签和自定义标签两种,前一篇文章分析了Spring中对默认标签的解析过程. 本文将分析Spring中自定义标签的使用过程: 一:回顾 public class DefaultBeanDefinitionDocumentReader implements BeanDefinitionDocumentReader { /** * Parse the elements at the root level in the document: * "imp

dubbo源码学习(二) : spring 自定义标签

做dubbo的配置时很容易发现,dubbo有一套自己的标签,提供给开发者配置,其实每一个标签对应着一个 实体,在容器启动的时候,dubbo会对所有的配置进行解析然后将解析后的内容设置到实体里,最终dubbo会根据实体中的值生成贯穿全局的统一URL.利用自定义标签使配置简单明了化,与spring完美融合.下面自己写一个自定义标签,主要需要如下 几个步骤: 1.编写实体类2.编写Parser解析类3.编写NameSpaceHandle类4.配置spring.handlers5.配置spring.sc

Spring 自定义标签配置

前景:经常使用一些依赖于Spring的组件时,发现可以通过自定义配置Spring的标签来实现插件的注入,例如数据库源的配置,Mybatis的配置等.那么这些Spring标签是如何自定义配置的?学习Spring标签的自定义配置为以后实现分布式服务框架做技术储备. 技术分析:Spring的标签配置是通过XML来实现的,通过XSD(xml Schema Definition)来定义元素,属性,数据类型等. Spring自定义标签解析 1.Spring启动时通过扫描根目录下的META-INF文件下的sp

Spring自定义标签

一.原理: 1.Spring通过XML解析程序将其解析为DOM树, 2.通过NamespaceHandler指定对应的Namespace的BeanDefinitionParser将其转换成BeanDefinition. 3.再通过Spring自身的功能对BeanDefinition实例化对象. 二.自定义标签步骤 1.定义三个文件 META-INF/spring.handlers http\://www.newlandframework.com/dubbo=com.newlandframewor

spring 自定义标签 学习

自定义配置文件到spring 中,有时候想做一些数据结构的配置化信息,根据业务做一个扩展. 首先: 在项目的META-INF目录下新建两个文件spring.handlers,和spring.shcemas Spring.handlers在类org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver中已经写死了要取mapping的handlerMappingsLocation的路径 public static fina

spring源码研究2 自定义标签实现及使用

1.自定义标签实现及使用参考: http://blog.csdn.net/fighterandknight/article/details/50112701 1)创建一个需要扩展的组件 User.java 2)定义一个XSD文件,描述组件内容 user.xsd 3)创建一个java类 MyParser.java ,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义 4)创建一个Handler类 MyNamespaceHandler.java ,扩展子NameS