首页 > 其他分享 >Spring实践之自定义命名空间并解析

Spring实践之自定义命名空间并解析

时间:2023-12-03 21:45:34浏览次数:35  
标签:name 自定义 Spring dog com harvey 解析 open public

自定义一个命名空间

1、新建一个空项目,在 resources/META-INF 目录下新建一个 spring.handlers 文件,内容如下:

http\://open.harvey.com/schema/dog=com.harvey.open.annotation.spring.DogNamespaceHandler

文件内容为一个键值对。

key 为自定义命名空间:http://open.harvey.com/schema/dog

value 为自定义命名空间对应的 NameSpaceHandler :com.harvey.open.annotation.spring.DogNamespaceHandler

2、在 resources/META-INF 目录下新建一个 spring.schemas 文件,内容如下:

http\://open.harvey.com/schema/dog/dog-1.0.xsd=./com/harvey/open/dog/config/dog-1.0.xsd

文件内容为一个键值对。

key 为 schema 的 Url:http://open.harvey.com/schema/dog/dog-1.0.xsd

value 为本地 schema 路径:./com/harvey/open/dog/config/dog-1.0.xsd

3、对应第1步 spring.handlers 内容中的 value,在 com.harvey.open.annotation.spring 目录下新建 DogNamespaceHandler.java,内容如下:

package com.harvey.open.annotation.spring;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class DogNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        // 注册一个自定义的解析器, 用于解析命名空间下的annotation节点
        registerBeanDefinitionParser("annotation", new DogAnnotationDefinitionParser());
    }
}

这里用到了org.springframework.beans.factory.xml.NamespaceHandlerSupport,所以需要导入依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

新建 DogAnnotationDefinitionParser.java,内容如下:

package com.harvey.open.annotation.spring;
import org.springframework.beans.MutablePropertyValues;
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 DogAnnotationDefinitionParser implements BeanDefinitionParser {
    @Override
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(DogBean.class);
        MutablePropertyValues mutablePropertyValues = beanDefinition.getPropertyValues();
        // 添加name属性
        if (element.hasAttribute("name")) {
            mutablePropertyValues.addPropertyValue("name", element.getAttribute("name"));
        }
        // 添加package属性
        if (element.hasAttribute("package")) {
            mutablePropertyValues.addPropertyValue("package", element.getAttribute("package"));
        }
        String id = element.getAttribute("id");
        // 拿到注册表, 注册BeanDefinition
        parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
        return beanDefinition;
    }
}

其中用到的 DogBean 代码如下:

package com.harvey.open.annotation.spring;

public class DogBean {

    private String name;

    private String basePackage;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPackage() {
        return basePackage;
    }

    public void setPackage(String basePackage) {
        this.basePackage = basePackage;
    }

    @Override
    public String toString() {
        return "DogBean{" +
            "name='" + name + '\'' +
            ", basePackage='" + basePackage + '\'' +
            '}';
    }
}

4、对应第2步 spring.schemas 内容中的 value,在 resource下新建目录:com.harvey.open.dog.config,在目下新建文件 dog-1.0.xsd,内容如下: 

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://open.harvey.com/schema/dog"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://open.harvey.com/schema/dog"
            elementFormDefault="qualified">
    <xsd:complexType name="annotationType">
        <xsd:attribute name="id" type="xsd:ID">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The unique identifier for a bean. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="name" type="xsd:string">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The name of bean. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="package" type="xsd:string">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The scan package. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
    </xsd:complexType>
    <xsd:element name="annotation" type="annotationType">
        <xsd:annotation>
            <xsd:documentation><![CDATA[ The annotation config ]]></xsd:documentation>
        </xsd:annotation>
    </xsd:element>
</xsd:schema>

至此,一个简单的自定义命名空间已经完成,我们将该项目打成 jar包到本地仓库。

全部文件的结构图如下:

使用自定义命名空间

上面我们将自定义命名空间项目打成 jar 包到本地仓库,下面我们来简单的使用一下。

1、在 maven 中添加依赖

<dependency>
    <groupId>com.harvey</groupId>
    <artifactId>open-harvey-annotation</artifactId>
    <version>1.0.0</version>
</dependency>

2、在配置文件中使用自定义命名空间,例如:

 

 3、写个 main 方法测试一下

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

public class Main {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
        System.out.println(applicationContext.getBean("dog"));
    }
}

运行后输出:DogBean{name='Spike', basePackage='com.harvey.open.service'}

 

标签:name,自定义,Spring,dog,com,harvey,解析,open,public
From: https://www.cnblogs.com/xfeiyun/p/17872901.html

相关文章

  • OEL 5.5配置DNS正反方向解析
    文档课题:OEL5.5配置DNS正反方向解析.系统:OEL5.564位1、安装bind包[root@dns~]#mount/dev/cdrom/mntmount:blockdevice/dev/cdromiswrite-protected,mountingread-only[root@dns~]#df-hFilesystemSizeUsedAvailUse%Mountedon/dev/sda3......
  • SpringContextUtil工具类记录
    1.SpringContextUtil工具类记录,可在无法注入Bean的时候选择使用,比如在枚举类中实际上是无法使用被IOC管理的Bean的,除非是通过方法传入,现在提供一个工具类解决这个问题(做记录)。@ComponentpublicclassSpringContextUtilimplementsApplicationContextAware{privatestat......
  • SpringBoot 统一异常处理
    1.在SpringBoot中项目中常见的统一异常处理方式是:使用@RestControllerAdvice和@ExceptionHandler注解。项目中的所有类型异常都会被抛到统一异常处理类中统一处理。预期效果如下:2.新建一个异常类ParamValidException,继承RuntimeException.@DatapublicclassParamValidExcepti......
  • 自定义精美商品分类列表组件 侧边栏商品分类组件 category组件(适配vue3)
    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随意的进行组合。大大提升开发效率......
  • sms-pdu TP-User-Data的解析
    gsm文档[[23038-i00.docx]]sms内容--7bit和ucs2编码方式在3GTS23.040中,9.2.2PDUTyperepertoireatSM-TL中,有介绍六种类型的SMS,其中五种都有TP-User-Data的域,这部分的呈现也就是我们看到的SMS内容在3GTS23.038中,4SMSDataCodingScheme中,会记录内容的三种编码方式7......
  • 【C语言】自定义类型:联合和枚举
    1、联合体1.1、联合体类型的声明像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共用体。给联合体其中⼀个成员赋值,其他成员的值也跟着变化。#inclu......
  • springboot上传文件
    privatefinalstaticStringFILE_UPLOAD_PATH="D:\\upload\\";@RequestMapping(value="/uploadFile",method=RequestMethod.POST)@ResponseBodypublicRuploadFile(@RequestParam("file")MultipartFilefile){......
  • 【C语言】自定义类型:结构体
    1、结构体类型的声明1.1、结构体的概念结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。1.2、结构的声明structtag{member-list;}variable-list;在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为实例://此声明......
  • 精通C#要点:解析委托、匿名方法与事件
    文章目录委托(Delegate)委托的特性声明委托实例化委托委托的多播(MulticastingofaDelegate)委托的用途匿名方法委托实际应用场景事件(Event)声明事件事件实例1事件实例2事件实例3委托和事件的区别总结 委托(Delegate)委托是对具有特定参数列表和返回类型的方法的......
  • streamlit 展示自定义 html 以及 css
    目前探索出来的有效方法:style="""<style>.memo-box{border:1pxsolid#ccc;padding:10px;margin-bottom:20px;}.tag{font-size:12px;color:#88......