`

Spring自定义标签

 
阅读更多

Spring自定义标签的原理

XML通常通过DTD、XSD定义,但DTD的表达能力较弱,XSD定义则能力比较强,能够定义类型,出现次数等。自定义标签需要XSD支持,在实现时使用Namespace扩展来支持自定义标签。

当你在苦逼的写下面的代码时:

<bean id="beanId" class="com.xxx.xxxx.Xxxxx">
        <property name="property1">
            <value>XXXX</value>
        </property>
        <property name="property2">
            <value>XXXX</value>
        </property>
    </bean>

 是不是会羡慕这样写代码呢?

<xxx:xxxx id="beanId"/>

 

 

Spring通过XML解析程序将其解析为DOM树,通过NamespaceHandler指定对应的Namespace的BeanDefinitionParser将其转换成BeanDefinition。再通过Spring自身的功能对BeanDefinition实例化对象。

在期间,Spring还会加载两项资料:

  • META-INF/spring.handlers 
    指定NamespaceHandler(实现org.springframework.beans.factory.xml.NamespaceHandler)接口,或使用org.springframework.beans.factory.xml.NamespaceHandlerSupport的子类。
  • META-INF/spring.schemas 
    在解析XML文件时将XSD重定向到本地文件,避免在解析XML文件时需要上网下载XSD文件。通过现实org.xml.sax.EntityResolver接口来实现该功能。

制作自定义的标签

spring.handlers:

 

http\://test.hatter.me/schema/test=me.hatter.test.TestNamespaceHandler

 spring.schemas:

 

http\://test.hatter.me/schema/test/test.xsd=META-INF/test.xsd

 test.xsd:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://test.hatter.me/schema/test"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://test.hatter.me/schema/test">

        <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>

 me.hatter.test.TestNamespaceHandler:

 

package me.hatter.test;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class TestNamespaceHandler extends NamespaceHandlerSupport {

    public void init() {
        registerBeanDefinitionParser("custom", new TestCustomBeanDefinitionParser());
    }
}

 me.hatter.test.TestCustomBeanDefinitionParser:

 

package me.hatter.test;

import me.hatter.test.bean.TestBean;

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;
    }
}

 

测试代码

test.xml:

 

<?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:test="http://test.hatter.me/schema/test"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://test.hatter.me/schema/test http://test.hatter.me/schema/test/test.xsd">
        
        <test:custom id="testCustom" name="this is a test custom tag" />
</beans>

 me.hatter.test.main.Main:

package me.hatter.test.main;

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

public class Main {

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

 上例输出为:

TestBean[name=thisis a test custom tag]
分享到:
评论

相关推荐

    spring自定义标签例子

    在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过Chapter2工程的实例来学习。 Spring框架的自定义标签通常用于简化XML配置,提升可读性和可维护性。这些标签是基于Java的`org.spring...

    spring自定义标签

    本文将深入探讨Spring自定义标签的概念、实现过程及其在实际开发中的应用。 首先,理解Spring自定义标签的核心思想:通过扩展Spring的`BeanDefinitionParser`接口或使用`BeanDefinitionBuilder`类,我们可以创建...

    这一次搞懂Spring自定义标签以及注解解析原理说明.docx

    总的来说,Spring自定义标签和注解解析原理的学习,不仅能够帮助开发者深入理解Spring的工作机制,还能提供自定义配置和扩展Spring功能的能力。通过这种方式,开发者可以根据项目需求创建出更符合业务逻辑的配置方式...

    自定义精简版dubbo,运用spring自定义标签、netty、zookeeper、ImportBeanDefinition实现

    自定义精简版dubbo,运用spring自定义标签、netty、zookeeper、ImportBeanDefinition实现

    Spring 5.2.9 06 源码分析-spring自定义标签解析过程

    在Spring框架中,自定义标签解析是扩展Spring配置能力的重要方式。通过自定义标签,开发者可以创建更加符合业务逻辑和可读性强的XML配置文件。本文将深入剖析Spring 5.2.9版本中自定义标签的解析过程,旨在帮助读者...

    这一次搞懂Spring自定义标签以及注解解析原理说明

    在Spring框架中,自定义标签和注解解析是两个关键的特性,它们使得代码与配置的集成更加紧密,简化了应用程序的开发。本篇文章将深入探讨Spring如何处理这两种类型的元数据。 首先,让我们来理解Spring如何解析...

    06 源码分析-spring自定义标签解析过程

    在Spring框架中,自定义标签的解析过程是一个关键的组件,它使得开发者能够通过XML配置文件以更加直观和简洁的方式声明Bean的定义。本节将深入探讨Spring 5.2.9版本中自定义标签的解析机制,以及背后的源码实现。 ...

    spring-扩展点-namespacehandler(Spring自定义标签)

    当我们需要在Spring配置文件中引入自定义标签时,`NamespaceHandler`起着至关重要的作用。这篇博文通过分析`spring-web-namespacehandler`,将深入探讨这一主题。 首先,`NamespaceHandler`是Spring框架解析XML配置...

    spring 自定义xml标签

    4. **使用自定义标签**:现在,你可以在Spring的XML配置文件中自由地使用自定义标签了,如`&lt;dubbo:service interface="com.example.MyService" version="1.0.0" /&gt;`。 通过这种方式,我们可以创建出高度定制化的XML...

    spring mvc freemarker 自定义标签

    下面将详细介绍Spring MVC与Freemarker自定义标签的使用。 首先,我们需要了解Freemarker的基础。Freemarker是一个基于模板的语言,它的主要任务是根据数据模型生成输出。在Spring MVC中,Freemarker模板通常用于...

    Spring源码解密之自定义标签与解析

    本篇文章将深入探讨Spring自定义标签的定义、解析以及相关源码分析。 首先,自定义标签的定义通常涉及到两个主要步骤: 1. **定义XSD文件**: XSD(XML Schema Definition)文件用于描述XML文档的结构和数据类型...

    spring 自定义属性编辑器

    - 配置文件注册:在Spring的XML配置文件中,通过`&lt;bean&gt;`标签的`property-editorRegistrar`属性指定一个实现了`PropertyEditorRegistrar`接口的类。在该类的`registerEditors()`方法中,可以使用`...

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

    基于Spring开发之自定义标签及其解析 Spring框架是现在Java最流行的开源框架之一,需要实现一些自定义的标签,主要是方便使用我们框架的人能够快速、简单进行配置。自定义标签的实现离不开XML Schema的定义,我们...

    Spring自定义配置文件便签[Maven]工程可运行

    这个名为"Spring自定义配置文件便签[Maven]工程可运行"的项目,显然是一个基于Maven构建的Spring 5.0应用程序,它包含了自定义配置文件和标签的实现。让我们深入探讨一下这些概念及其在实际应用中的作用。 首先,...

    spring自定义切面实例

    标题:“spring自定义切面实例” 描述:本文档将深入探讨如何在Spring框架中实现自定义切面(Aspect),并提供具体的代码示例。通过利用Spring的AOP(面向切面编程)特性,特别是@AspectJ注解的支持,我们可以创建...

    freemark 自定义标签 总结

    自定义标签可以与Spring MVC、Struts2等框架集成,提供更丰富的功能。 通过上述内容,我们了解了Freemarker自定义标签的基本概念、创建与使用方法,以及如何在实际项目中发挥作用。自定义标签极大地增强了...

    spring security进级篇 V 自定义标签控制显示

    这篇"Spring Security进阶篇 V 自定义标签控制显示"的博客文章显然深入探讨了如何在Spring Security中实现自定义的安全控制,以便更好地管理和展示应用内容。在本文中,我们将详细解析这个主题,并与"JSP自定义标签...

    Web2.0体系学习(自定义标签)

    - Spring Web Flow、JSF等框架也提供了自定义标签的机制,进一步丰富了Web2.0开发中的自定义标签应用。 通过自定义标签,Web2.0应用可以更加灵活地构建用户界面,提供定制化的交互体验。同时,这也有助于提升...

    扩展自定义Spring标签思维导图

    实现spring自定义扩展标签的实现步骤

Global site tag (gtag.js) - Google Analytics