自定义标签解析

MyBatis内置XML元素解析器解析自定义标签——快速掌握MyBatis自定义标签开发 作为一个技术人员,一定要懂得把自己的知识通过有效的表达传递给他人。我认为把自己的知识通过文章的方式进行传播是非常有必要的。这也是技术博客文章的重要性。MyBatis 是 Apache 基金会的一个开源项目,它是一个优秀的持久层框架,可以用于 Java 的应用开发。MyBatis 提供了强大的映射工具,使得数据库操作变得简单而方便。MyBatis 在 MyBatis-Spring 中也提供了 Spring 和 MyBatis 之间的集成支持。 阅读详情

自定义标签解析

自定义标签使用

很多情况下,需要为系统提供可配置化支持,简单做法可以直接基于Spring的标准bean来配置,但配置较为复杂或者需要更多丰富控制的时候,会变得很难配置。
一般可以自己解析定义好的XML文件,然后转化为配置对象,这种方式可以解决问题但实现起来比较复杂。Spring提供了可扩展Schema的支持,扩展Spring
自定义标签配置大致需要以下几步

  • 创建一个需要扩展的组件

  • 定义一个XSD文件描述组件内容

  • 创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义

  • 创建一个Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器

  • 编写Spring.handles和Spring.schemas文件

具体操作如下

(1) 首先创建一个普通POJO

package org.aim.spring.lookup_method;

public class User {
    private String userName;
    private String email;

    public void showMe(){
        System.out.println("I am user");
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

(2) 定义一个XSD文件描述组件内容

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.aim.org/schema/user"
        xmlns:tns="http://www.aim.org/schema/user"
        elementFormDefault="qualified">
    <element name="user">
        <complexType>
            <attribute name="id" type="string" />
            <attribute name="userName" type="string" />
            <attribute name="email" type="string" />
        </complexType>
    </element>
</schema>

XSD文件中描述了一个新的targetNamespace,并在这个空间中定义一个name为user的element,user有三个属性id、userName和email,email类型为
string

(3) 创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义

package org.aim.spring.custom;

import org.aim.spring.lookup_method.User;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    // Element对应的类
    @Override
    protected Class<?> getBeanClass(Element element) {
        return User.class;
    }

    // 从element中解析并提取对应的元素
    @Override
    protected void doParse(Element element, BeanDefinitionBuilder builder) {
        String userName = element.getAttribute("userName");
        String email = element.getAttribute("email");
        // 将提取的数据放入BeanDefinitionBuilder中,待所有bean解析完成后统一组册到beanFactory
        if(StringUtils.hasText(userName)){
            builder.addPropertyValue("userName", userName);
        }
        if(StringUtils.hasText(email)){
            builder.addPropertyValue("email", email);
        }
    }
}

(4) 创建一个Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器。以下代码当遇到自定义标签<user:aaa这样类似于以
user开头的元素,就会把这个元素交由UserBeanDefinitionParser去解析

package org.aim.spring.custom;

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

public class MyNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
    }
}

(5) 编写Spring.handlers和Spring.schemas文件,默认位置是在工程的/META-INF/文件夹下,也可以通过Spring的扩展或修改源码的方式改变路径

// Spring.handlers
http\://www.aim.org/schema/user=org.aim.spring.custom.MyNamespaceHandler

// Spring.schemas
http\://www.lexueba.com/schema/user.xsd=user.xsd

自定义配置到这里就完成了,Spring加载自定义的大致流程是遇到自定义标签后通过Spring.handlers和Spring.schemas中找对应的handler和XSD,默认
位置是/META-INF/下,进而找到handler及解析元素的Parser,完成整个自定义元素的解析。自定义标签与Spring默认的标准标签不同在于,自定义标签
将解析的工作交给用户去实现

(6) 创建测试配置文件,在配置文件中引入对应的命名空间及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:myname="http://www.aim.org/schema/user"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.aim.org/schema/user http://www.aim.org/schema/user.xsd">

    <myname:user id="testbean" userName="aaa" email="bbb"></myname:user>

</beans>

(7) 测试通过自定义标签获取Bean

@Test
public void customTagTest(){
    ApplicationContext bf = new ClassPathXmlApplicationContext("CustomTagTest.xml");
    User user = (User) bf.getBean("testbean");
    System.out.println(user.getUserName() + "," + user.getEmail());
}

自定义标签解析

我们来看一下自定义标签的解析过程

public BeanDefinition parseCustomElement(Element ele) {
    return parseCustomElement(ele, null);
}

// containingBd是父类bean,对顶层元素的解析设置为null
public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
    // 获取对应的命名空间
    String namespaceUri = getNamespaceURI(ele);
    // 根据命名空间找到对应的NamespaceHandler
    NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
    if (handler == null) {
        error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
        return null;
    }
    // 调用自定义的NamespaceHandler进行解析
    return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}

其实现思路是先根据对应bean获取对应的命名空间,根据命名空间获取对应的处理器,调用用户自定义的处理器完成解析

获取标签的命名空间

标签的解析是从命名空间的提取开始的,无论是区分Spring默认标签和自定义标签还是区分自定义标签中不同标签的处理器都是以标签所提供的命名空间为
基础的,提取对应元素的命名空间并不需要我们自己实现,在org.w3c.dom.Node中已经提供方法

public String getNamespaceURI(Node node) {
    return node.getNamespaceURI();
}

提取自定义标签处理器

获取命名空间后,就可以进行NamespaceHandler提取了。在readerContext初始化的时候其属性namespaceHandlerResolver已经被初始化为DefaultNamespaceHandlerResolver
的实例,因此调用resolve方法其实调用的是DefaultNamespaceHandlerResolver中的方法,在DefaultNamespaceHandlerResolver中resolve方法
如下

public NamespaceHandler resolve(String namespaceUri) {
    // 获取所有已经配置的handler映射
    Map<String, Object> handlerMappings = getHandlerMappings();
    // 根据命名空间找到对应的handler信息
    Object handlerOrClassName = handlerMappings.get(namespaceUri);
    if (handlerOrClassName == null) {
        return null;
    }
    else if (handlerOrClassName instanceof NamespaceHandler) {
        // 已经解析过直接返回
        return (NamespaceHandler) handlerOrClassName;
    }
    else {
        // 没做过解析返回的是类路径字符串
        String className = (String) handlerOrClassName;
        try {
            // 通过反射根据类路径加载类
            Class<?> handlerClass = ClassUtils.forName(className, this.classLoader);
            if (!NamespaceHandler.class.isAssignableFrom(handlerClass)) {
                throw new FatalBeanException("Class [" + className + "] for namespace [" + namespaceUri +
                        "] does not implement the [" + NamespaceHandler.class.getName() + "] interface");
            }
            // 实例化bean
            NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass);
            // 调用自定义解析handler的初始化方法
            namespaceHandler.init();
            // 记录在缓存中
            handlerMappings.put(namespaceUri, namespaceHandler);
            return namespaceHandler;
        }
        catch (ClassNotFoundException ex) {
            throw new FatalBeanException("NamespaceHandler class [" + className + "] for namespace [" +
                    namespaceUri + "] not found", ex);
        }
        catch (LinkageError err) {
            throw new FatalBeanException("Invalid NamespaceHandler class [" + className + "] for namespace [" +
                    namespaceUri + "]: problem with handler class file or dependent class", err);
        }
    }
}

Spring.handlers文件中配置了命名空间与命名空间处理器的映射关系。只有正确维护了此文件,Spring才能根据映射关系找到匹配的处理器,上面分析的
方法就是用于寻找处理,当获取到用户自定义的handler实现,后调用init方法执行BeanDefinitionParser注册。在这里可以注册多个标签解析器,如
<myname:A、<myname:B等,这里只支持<myname:user。

注册后,命名空间解析器就可以根据不同的标签调用不同的解析器实现解析。getHandlerMappings主要功能就是读取Spring.handlers配置文件并将配置
文件缓存在map中

private Map<String, Object> getHandlerMappings() {
    // 如果缓存中不存在,则解析并放入缓存
    if (this.handlerMappings == null) {
        synchronized (this) {
            if (this.handlerMappings == null) {
                try {
                    // this.handlerMappingsLocation 在构造函数中已经被初始化为:META-INF/Spring.handlers
                    Properties mappings =
                            PropertiesLoaderUtils.loadAllProperties(this.handlerMappingsLocation, this.classLoader);
                    if (logger.isDebugEnabled()) {
                        logger.debug("Loaded NamespaceHandler mappings: " + mappings);
                    }
                    Map<String, Object> handlerMappings = new ConcurrentHashMap<String, Object>(mappings.size());
                    // 将Properties格式合并到Map中
                    CollectionUtils.mergePropertiesIntoMap(mappings, handlerMappings);
                    this.handlerMappings = handlerMappings;
                }
                catch (IOException ex) {
                    throw new IllegalStateException(
                            "Unable to load NamespaceHandler mappings from location [" + this.handlerMappingsLocation + "]", ex);
                }
            }
        }
    }
    return this.handlerMappings;
}

借助工具类PropertiesLoaderUtils对属性handlerMappingsLocation进行配置文件读取,handlerMappingsLocation默认初始化为META-INF/spring.handlers

标签解析

获取到解析器以及要分析的元素后,Spring就可以将解析工作委托给自定义解析器去解析。此时handler已经被实例化为自定义MyNamespaceHandler,并
完成了初始化操作,但我们并没有在自定义命名空间中实现parse方法,这个方法是在父类中实现,查看父类NamespaceHandlerSupport中的parse方法

public BeanDefinition parse(Element element, ParserContext parserContext) {
    return findParserForElement(element, parserContext).parse(element, parserContext);
}

解析过程中首先寻找元素对应的解析器,进而调用解析器的parse方法,在本例中首先获取MyNameSpaceHandler类中的init方法中注册的对应的UserBeanDefinitionParser实例,
并调用其parse方法进行进一步解析

private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) {
    // 获取元素名称,在本例中就是<myname:user 中的user
    String localName = parserContext.getDelegate().getLocalName(element);
    // 根据user找到对应的解析器,即registerBeanDefinitionParser("user", new UserBeanDefinitionParser());中注册的解析器
    BeanDefinitionParser parser = this.parsers.get(localName);
    if (parser == null) {
        parserContext.getReaderContext().fatal(
                "Cannot locate BeanDefinitionParser for element [" + localName + "]", element);
    }
    return parser;
}

对于parse方法的处理

public final BeanDefinition parse(Element element, ParserContext parserContext) {
    AbstractBeanDefinition definition = parseInternal(element, parserContext);
    if (definition != null && !parserContext.isNested()) {
        try {
            String id = resolveId(element, definition, parserContext);
            if (!StringUtils.hasText(id)) {
                parserContext.getReaderContext().error(
                        "Id is required for element '" + parserContext.getDelegate().getLocalName(element)
                                + "' when used as a top-level tag", element);
            }
            String[] aliases = new String[0];
            String name = element.getAttribute(NAME_ATTRIBUTE);
            if (StringUtils.hasLength(name)) {
                aliases = StringUtils.trimArrayElements(StringUtils.commaDelimitedListToStringArray(name));
            }
            // 将AbstractBeanDefinition转换成BeanDefinitionHolder
            BeanDefinitionHolder holder = new BeanDefinitionHolder(definition, id, aliases);
            registerBeanDefinition(holder, parserContext.getRegistry());
            if (shouldFireEvents()) {
                // 通知监听器进行处理
                BeanComponentDefinition componentDefinition = new BeanComponentDefinition(holder);
                // 可继承覆盖
                postProcessComponentDefinition(componentDefinition);
                parserContext.registerComponent(componentDefinition);
            }
        }
        catch (BeanDefinitionStoreException ex) {
            parserContext.getReaderContext().error(ex.getMessage(), element);
            return null;
        }
    }
    return definition;
}

上述方法中大部分代码是用来处理解析后的AbstractBeanDefinition转化为BeanDefinitionHolder并注册的功能,真正解析的操作是委托给了parseInternal
方法,在此方法中就调用了我们自定义的解析函数

在parseInternal中并没有直接调用doParse函数,而是先进行一系列数据准备,包括对beanClass、scope、lazyInit等属性的准备

@Override
protected final AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
    String parentName = getParentName(element);
    if (parentName != null) {
        builder.getRawBeanDefinition().setParentName(parentName);
    }
    // 获取自定义标签中class,此时会调用自定义解析器UserBeanDefinitionParser中的getBeanClass方法
    Class<?> beanClass = getBeanClass(element);
    if (beanClass != null) {
        builder.getRawBeanDefinition().setBeanClass(beanClass);
    }
    else {
        // 若子类没有重写getBeanClass方法则尝试检查子类是否重写getBeanClassName方法
        String beanClassName = getBeanClassName(element);
        if (beanClassName != null) {
            builder.getRawBeanDefinition().setBeanClassName(beanClassName);
        }
    }
    builder.getRawBeanDefinition().setSource(parserContext.extractSource(element));
    if (parserContext.isNested()) {
        // 若存在父类,则使用父类的scope属性
        builder.setScope(parserContext.getContainingBeanDefinition().getScope());
    }
    if (parserContext.isDefaultLazyInit()) {
        // 配置延迟加载
        builder.setLazyInit(true);
    }
    // 调用子类重写的doParse方法进行解析
    doParse(element, parserContext, builder);
    return builder.getBeanDefinition();
}

虽然在实例中我们定义UserBeanDefinitionParser,但我们只做了与自己业务逻辑相关的部分。其实在这个过程中同样也是按照Spring中默认标签的处理
方式进行,包括创建BeanDefinition以及进行相应默认属性的设置,对于这些工作Spring都默认帮我们实现了,只是暴露一些接口来供用户实现个性化业务。

vivado:差分信号和单端信号 的相互转换 IBUFDS OBUFDS FPGA能处理的都是单端信号,但有些输入信号是差分的,这时候就需要把差分信号转为单端信号。 阅读详情

相关推荐

对工时评估的思考:当AI颠覆了coding效率

在AI时代,“人日”作为软件工时度量衡已然失效。开发的价值核心正从“编码实现”转向“深度思考”与“精准沟通”——即如何将人类的模糊需求精确地传达给AI。当最有价值的“思想工作”变得最难量化时,传统的项目管理范式随之动摇。我们必须超越对过程的算计,开始探索衡量思想、沟通与业务价值的新标尺。

架构师刘7的博客 1017

HTML简单概述及常用标签解析

HTML用来描述网页的一种语言HTML – hyper text markup language 超文本标记语言超文本包括:文字、图片、音频、视频、动画等等标记语言:是一套标记标签,HTML使用标记标签来描述网页。

qq_43036356的博客 626

RedVQA:轻量级无参考视频质量评估算法原理与工程实践

视频质量评估是计算机视觉领域的关键技术,旨在通过算法自动量化视频的观看体验。其核心原理在于模拟人眼视觉系统,从像素数据中提取并融合空域和时域特征,以预测主观质量分数。这项技术的价值在于,它能自动化处理海量视频内容的质量监控,为流媒体服务、移动设备影像优化等场景提供关键指标。无参考视频质量评估作为该领域的前沿方向,无需原始无损视频作为参考,更贴合实际应用。本文以RedVQA项目为例,深入剖析了如何利用轻量化的深度网络架构,如MobileNetV3,结合高效的时空特征融合模块,在保证评估精度的同时,大幅降低计算

weixin_28698129的博客 576

HTML常用标签详解

HTML常用标签详解 一、head内常用标签 1.基本标签(非meta标签) <!--title: 定义网页标题--> <title>Title</title> <!--style: 定义内部样式表. 内部用来书写css代码--> <style> h1 { color: greenyellow; } </style> <!--script: 内部用来书写js代码--> <script

淘小欣的博客 3万+

OpenClaw:深度学习驱动的智能编程工具实战解析

智能编程工具通过深度学习技术革新传统开发流程,其核心在于代码语义理解与实时协作能力。这类工具采用AI代码补全、错误预测等技术,显著降低开发者认知负荷,尤其适用于复杂业务逻辑开发和遗留系统维护场景。以OpenClaw为例,其智能填充和上下文感知功能可提升40%编码效率,减少65%调试时间。关键技术实现包含自然语言处理、代码静态分析等,在金融科技、电商系统等领域具有广泛应用前景。热词提示:代码理解引擎、智能工作流整合展现了当前AI辅助开发的最新趋势。

chubaisheng8627的博客 320

Proteus仿真实战:ADC0832时序解析与51单片机精准电压采集

本文详细解析了ADC0832模数转换芯片在Proteus仿真环境中的时序控制与51单片机驱动实现。通过实战代码示例和精度优化技巧,帮助开发者掌握电压采集的关键技术,包括时序配置、数据校验和噪声抑制等核心要点,提升嵌入式系统设计的精准度与可靠性。

weixin_29172963的博客 873

生成静态页函数参考

【功能】自定义模板标签Function ProcessCustomTags(ByVal sContent)         Dim objRegEx, Match, Matches      建立正则表达式         Set objRegEx = New RegExp      查找内容         objRegEx.Pattern = ""      忽略大小写        

wxd0963的专栏 675

从零构建个性化AI助手:基于Mem0与本地大模型的记忆化实践

本文详细介绍了如何利用Mem0与本地大模型构建个性化AI助手,实现记忆化应用结构的实践方法。从开发环境搭建、记忆存储机制到个性化交互实现,提供了完整的解决方案和代码示例,帮助开发者在本地环境中创建能记住用户习惯和偏好的智能助手。

weixin_29214335的博客 470

HTML标签详解

本文主要内容 头标签 排版标签:<p>、 <div>、 <span>、<br> 、 <hr> 、 <center> 、 <pre> 字体标记:<h1>、 <font>、 <b>、 <u> 、<sup> 、<sub> 超链接 <a>...

conquerman的博客 3645

[明道云] -基础教学5- 明道云 40 种控件详解与场景解析

明道云工作表提供40种业务控件,涵盖文本、数值、关联、公式等类型,支持各类业务场景。文本类支持多行输入、正则校验;数值/金额类提供进度条、百分比显示等功能;关联类实现多表数据引用;公式/函数类支持复杂逻辑运算;自动化类包括打印模板、API调用等控件。合理使用这些控件可提升数据收集质量和自动化效率,同时需注意控件联动的性能影响和权限配置。关键控件包括关联记录、级联选择、公式计算等,适用于订单管理、客户信息关联等业务场景。

每日出拳老爷子的博客 8542

CloudCompare 二次开发(41)——点云重建三维凸包并计算体积

本文介绍了如何结合PCL与CloudCompare实现点云三维凸包的构建与可视化。通过代码集成,在CloudCompare界面添加功能按钮,实现点云数据转换、凸包构建、体积计算以及可视化显示。具体步骤包括:1) 在UI中添加功能按钮;2) 将点云数据转换为PCL格式;3) 使用PCL的ConvexHull算法构建三维凸包;4) 计算并显示凸包体积;5) 将结果以点云和网格形式可视化显示。最终实现了点云凸包的自动构建与体积计算功能,为点云处理提供了实用工具。

点云侠的博客 194

HTML标签

HTML标签 HTML标记标签通常被称为HTML标签 HTML标签是有尖括号包围的关键词,比如 <head><html><body> html标签分为单标签与双标签 单标签:<input />本身不包含文本或子标签 双标签:<div></div>第一个标签是开始标签(开放标签),第二个标签是结束标签(闭合标签),开头结尾之间被...

HBF__cg的博客 272

可维护的 SAP UI5 Theming 策略:从 CSS 级联与特性选择器到 UI Theme Designer 的工程化落地

摘要:SAP UI5主题化是一个涉及CSS级联、选择器特异性和主题参数的系统工程,与应用逻辑解耦以实现品牌化和无障碍适配。轻量级调整优先使用附加CSS,重大改动才考虑创建新主题。样式冲突需通过特异性原则解决,避免滥用!important。动态添加样式应使用addStyleClass而非直接操作DOM。主题可通过bootstrap参数、URL或运行时API设置,企业级主题推荐使用UI Theme Designer。自定义内容应消费主题变量以实现一致性,避免直接修改控件内部结构或内联样式。工程化落地需规范分层和

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

[Spring] 自定义标签解析

Spring 除了实现了默认的标签解析,如 bean, beans, import, alias,还提供了自定义的标签解析机制,由用户实现解析自定义标签的逻辑,如: aop, tx, context 等。

列苗 738

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring自定义标签的解析

前面已经讲了Spring中默认标签的解析过程,下面开始分析自定义标签的解析. 还是从最开始配置文件解析成document,并且得到对应的root之后,开始对所有的元素进行解析,而就是这里边会分默认和自定义标签两种格式的区分: protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeL

qq_40708942的博客 755

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring自定义标签解析

Spring源码分析: 1.Spring源码之XML默认标签解析 2.Spring自定义标签解析 自定义标签解析 除了 Spring 默认的标签,还可以自定义标签,如最常使用的 context:component-scan,并且通过改标签的命名空间来解析。 那么什么是命名空间? 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。 如 Spring 的 XML 配置文件,配置项都在 <beans> 标签中,但这时开发者如果自定义一个自己的标签,同样命名

个人站点:javatv.net 746

【Spring详解四】自定义标签的解析

自定义标签解析通过 BeanDefinitionParserDelegate.parseCustomElement() 方法进行。 解析流程包括获取命名空间、查找处理器、调用处理器解析标签、将解析结果转换为 BeanDefinition。 NamespaceHandler 负责将命名空间与处理器进行映射。 BeanDefinitionParser 负责解析标签内容并生成 BeanDefinition。

叉烧钵钵鸡的博客 1175

Spring框架中自定义标签的解析过程

本文深入解析了Spring框架中自定义标签的创建与使用机制。文章首先介绍了自定义标签的概念及其在提高配置可读性、封装复杂配置方面的优势。随后详细阐述了创建自定义标签的四个关键步骤:定义XML Schema文件描述标签结构,实现NamespaceHandler进行命名空间映射,编写BeanDefinitionParser解析XML元素,以及注册相关配置文件(spring.handlers和spring.schemas)。

持续输出Java相关知识 1383

自定义标签的解析

自定义标签的解析简介自定义标签的使用栗子:自定义标签解析获取标签的命名空间提取自定义标签处理器标签解析 简介 我们知道在Spring 中存在 默认标签和自定义标签 两种类型,前面说过默认标签了,现在来分析一下Spring中自定义标签的加载过程。同样,现在回顾一下,当完成从配置文件到Document 的转换并提取对应的root后,将开始了所有元素的解析,而在这一过程中便开始了默认标签与自定义标签两种格式的区分,函数如下: DefaultBeanDefinitionDocumentReader.java pr

my_air的博客 860

htmlparser中自定义html标签进行解析

原文出处:http://www.mzone.cc/article/270.html    htmlparser是一个基于java的用来解析html页面的开源组件,可以很方便对html页面进行标签分析、动态修改、删除特定的html标签等。但有些时候,我们可能需要自定义非HTML标签实现一些额外的功能,比如我经常使用htmlparser解析并处理页面后需要返回最终的处理结果,一般情况下我们获取html...

听雨轩 582

spring自定义标签解析

记录一下spring自定义标签理解过程。 关键的三个点 spring.handlers和spring.schemas配置文件解析。 user.xsd对象解析id和name作为spring的基础数据会被解析 了解一下NamespaceHandlerSupport的parser方法调用逻辑,xml对象如何被解析。 文件夹目录 示例执行结果 在这里插入图片描述 主题目录 ***point 1/3> MATE-INF目录写死 ***point 2/3> 调用DefaultNamespaceHa

weixin_50750933的博客 310

【Spring源码解析】Spring XML配置自定义标签的解析

spring bean自定义标签解析

燃尽余火的博客 578

Spring——3. 自定义标签的解析

文章目录1. 自定义标签的使用2. 自定义标签的解析2.1 获取自定义标签的命名空间2.2 获取自定义标签的自定义处理器2.2.1 获取handlerMappings2.2.2 通过namespaceUri获取NamespaceHandler2.3 解析自定义标签2.3.1 获取自定义标签的自定义解析器2.3.2 调用父类解析器进行解析3. 整体流程思维导图 自定义标签的解析 在上文中完成了Spring中对默认标签的解析过程的分析,现在继续Spring中自定义标签的解析。 delegate.parseCus

m0_52325992的博客 263

Spring源码深度解析 自定义标签的解析总结

当完成从配置文件到 Document 的转换并提取对应的 root 后,将开始了所有元素的解析,而在这一过程 中便开始了默认标签与自定义标签两种格式的区分 当 Spring 拿到一个元素时首先要做的是根据命名空间进行解析, 如果是默认的命名空间,则使用 parseDefaultElement 方法进行元素解析,否则使用 parseCustomElement 方法进行解析 自定义标签使用 扩展 Spring 自定义标签配置大致需要以下几个步骤(前提是要把 Spring Core包加入项目中) 创建一个需要扩

勤劳的搬运工 374
上一篇: 调优Kafka集群
下一篇: Dispatcher has no subscribers for channel排坑指南
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值