手写一个springboot starter,并使用starter

news2024/11/26 8:51:39

文章目录

  • 前言
  • 一、starter的作用和意义
  • 二、自定义一个starter并使用
    • 1.starter本体
      • 问题:
    • 2.创建另外一个项目,引入自定义的starter
  • 总结
      • spring-configuration-metadata.json


前言

你一定用过很多starter , 例如 spring-boot-starter,spring-boot-starter-test等等,那么如何实现一个自定义的starter,以及自定义starter的意义和作用;


一、starter的作用和意义

作用: starter可以非常方便的引入到springboot项目中,有利于项目的统一管理,例如: 项目中一般会有字符集过滤,会有时间格式统一转换,可以选择通过拦截器实现,但是starter也可以实现,而且也更加统一,灵活,更加方便统一管理;

意义: 可以更好的了解spi机制,更好的对于springboot 自动配置有深入了解;

想要了解spi机制,可以访问我的另一篇文章: SPI机制

二、自定义一个starter并使用

总体思路:

  1. 创建一个项目作为starter本体,这里做一些事情,例如: 拦截所有路径,然后打印一下
  2. 创建另外一个项目,引入之前创建的starter,然后使用,看是否能够拦截路径,并打印
  3. starter本体打包后,需要发布到maven仓库中,然后另外一个项目通过maven引入
  4. maven仓库可以是私服,也可以是本地maven仓库

1.starter本体

  1. 在IDEA中创建项目,选择2.7版本,jdk 1.8,选择 spring web模块依赖
    创建项目
  2. pom修改, 在打包插件中加入 configuration skip true 标签
   <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
               <configuration>
                   <skip>true</skip>
               </configuration>
           </plugin>
       </plugins>
  1. 创建过滤器
public class CustomFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        System.out.println("Custom filter processing request for " + httpRequest.getRequestURI());
        chain.doFilter(request, response);
    }
}
  1. 创建一个配置类,CustomStarter ,将CustomFilter注入spring中
@Configuration
public class CustomStarter {

    @Bean
    public CustomFilter customFilter() {
        return new CustomFilter();
    }
}
  1. 在resources文件下创建META-INF文件夹,在文件夹下创建spring.factories文件,内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.custom.CustomStarter

文件位置示意图
6. 运行manve 命令, install,package
运行后,再次运行deploy ,将jar包推送至本地maven库中
本地maven仓库

问题:

已经在第4步中利用@Configuration 和 @Bean将 CustomFilter注入到了其中,为什么还用spi机制在META-INF文件夹下创建spring.factories,再次设置一遍自动配置呢?
因为: springboot启动正常扫描,只会扫描启动类包下的自动配置注解,这里的starter是要放到其他项目中的,根本不在使用项目的包下,所以要用spi机制,注入进去;

2.创建另外一个项目,引入自定义的starter

创建项目略过,仅仅说下pom文件
jar包内容

  1. 在pom中加入如下依赖
       <dependency>
            <groupId>com.example</groupId>
            <artifactId>custom</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

其中 com.example 为所在路径
custom 打包后的名字
0.0.1-SNAPSHOT为包的版本号
与上一个步骤中的 步骤6 图片完全一致,一一对应

  1. 在项目中随便搞一个接口
    访问接口
    访问效果

控制台一直打印 Custom filter processing request for /lang/get
说明我们自定的starter过滤器生效了,而且打印出了访问路径


总结

自定义一个starter并不是很难吧?我们需要了解starter的本质是什么,然后通过maven本地仓库实现了starter包的共享,然后就可以正常使用了;
本文仅仅是抛砖引玉,简单的starter示例;其中整合过程中,在引入starter之后,一直报错:

 java.lang.IllegalStateException:Unable to read meta-data class *******

这个class 就是 spring.factories文件内容中的class

这个错误的原因是starter打包之后的jar包中,并没有相应类,导致项目启动的时候,在spring.factories中读取到了这个类名,但是加载不到,是由于starter本地打包问题导致的,解决办法就是 starter本地步骤6,
在maven打包插件中加入skip标签
此时错误的starter jar包内容为(可运行包 java -jar 可以直接启动):
内容
而加入了skip 后打包,包中的内容为(依赖包):
正确内容
如果是gradle工具,同样也要区分出这两种包,不要用错!!

spring-configuration-metadata.json

这个文件也是自定义starter中常用的一个文件,可以理解为,正常这些配置应该放在项目的yml文件中的,但是由于自定义了starter,所以可以把这些配置文件转移到这个文件中,然后更便于统一管理;

下面是一些 spring-configuration-metadata.json 文件的属性详解:

“groups”:配置属性的分组信息。每个分组都是一个数组,数组中的每个元素都是一个对象,包含该分组的名称和描述信息。
例如:

"groups": [
  {
    "name": "database",
    "description": "Database configuration"
  },
  {
    "name": "logging",
    "description": "Logging configuration"
  }
]

“properties”:配置属性信息。每个属性都是一个对象,包含该属性的名称、类型、默认值、描述等信息。
例如:

"properties": [
  {
    "name": "database.url",
    "type": "java.lang.String",
    "defaultValue": "jdbc:mysql://localhost:3306/mydb",
    "description": "Database connection URL"
  },
  {
    "name": "logging.level",
    "type": "java.lang.String",
    "defaultValue": "INFO",
    "description": "Logging level"
  }
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1020135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信群发超过5000人是怎么办到的?

你是否好奇&#xff0c;微信官方对于普通用户的群发限制是500人&#xff0c;但是有些大佬的微信账号怎么能群发突破这个限制&#xff0c;甚至超过5000人&#xff0c;其实他们有可能都用到了这一款软件&#xff1a; https://youwokeji.feishu.cn/docx/RpybdOWpzo9tlqxlMk7c0VZb…

从键盘任意输出一个整数n,若n不是素数,则计算并输出其所有因子(不包括1),否则输出该数为素数

#include<stdio.h> int main() {int i 0;int j 0;int n 0;int tag 0;//设置一个标志位&#xff0c;不为素数时令tag1&#xff1b;printf("输入一个数&#xff1a;");scanf("%d", &n);for (i 2; i < n; i){if (n % i 0){printf("该…

让小爱同学播放本地/远程歌曲的方案 | 小爱音箱播放本地歌曲

环境:HACS+Python 问题:小爱同学不能播放本地歌曲或者群晖中的歌曲 解决办法:HACS + Http Server 背景:冲绿砖是不可能的,DLNA也被阉割了,只能曲线救国了 解决思路:通过HACS监控小爱事件,推送媒体链接并随机播放,具体看下面的流程图 文章目录 1.安装HACS:2.安装HACS…

操作系统的体系结构

一、内核结构 操作系统内核也有两种类别&#xff1a;大内核结构、微内核结构 大内核结构&#xff1a;也叫宏内核/单内核。将操作系统的主要功能模块都作为操作系统内核。大内核结构包括进程管理、存储器管理、设备管理等功能&#xff08;第四层&#xff09;和时钟管理、中断处理…

SpringSecurity 初始化解析

文章目录 前言加载SpringSecurity配置解析配置SpringSecurity 解析器security:http 解析FilterChainProxy的注册过程创建 SpringSecurity 过滤器总结 前言 通过上文分析知道了SpringSecurity对一个请求的具体处理流程。不知道大家是否跟我一样都有几个疑问&#xff1a; Filte…

半导体行业如何在跨网数据交换时保证核心数据是安全的?

半导体行业是高科技产业的核心&#xff0c;也是国家战略的重点领域。半导体产业涉及到芯片设计、制造、封装、测试等多个环节&#xff0c;每个环节都需要大量的数据支撑和交换。半导体企业的核心数据不仅包括技术方案、设计图纸、生产参数等&#xff0c;还包括市场分析、客户信…

创建当前工作簿的备份和一次关闭所有工作簿

【分享成果&#xff0c;随喜正能量】专注地做一件事&#xff0c;做到极致&#xff0c;胜过敷衍地做很多事。不求多&#xff0c;但求精&#xff0c;不求散&#xff0c;但求专。每个人的时间和精力都是有限的&#xff0c;专注于某个领域&#xff0c;沉得住气&#xff0c;静得下心…

Python常用算法合集【文末送书啦~】

前言 作者主页&#xff1a;涛哥聊Python 个人网站&#xff1a;涛哥聊Python 大家好&#xff0c;我是涛哥。 今天为大家分享Python常用算法合集&#xff0c;以及各算法的代码示例&#xff01;还会给大家赠送荣获CSDN“程序员IT好书评选”奖的《labuladong 算法小抄》&#xf…

报错Can‘t pickle local object ‘get_dataset.<locals>.<lambda>‘

将代码里所有 ’num_workers设为0 报错信息 "Cant pickle local object get_dataset.<locals>.<lambda>" 通常出现在使用多进程加载数据时&#xff0c;特别是在使用 Python 的 multiprocessing 模块时。这个错误是由于 Python 无法将局部函数&#xff0…

3D目标检测框架 MMDetection3D环境搭建 docker篇

本文介绍如何搭建3D目标检测框架&#xff0c;使用docker快速搭建MMDetection3D的开发环境&#xff0c;实现视觉3D目标检测、点云3D目标检测、多模态3D目标检测等等。 需要大家提前安装好docker&#xff0c;并且docker版本> 19.03。 1、下载MMDetection3D源码 https://gith…

公司内部网段太多,管控混乱,该如何规范跨网文件传输交换?

在当今的信息化时代&#xff0c;文件传输交换是企业日常工作中不可或缺的一项功能。无论是内部员工之间&#xff0c;还是与外部合作伙伴之间&#xff0c;都需要频繁地进行文件的发送、接收、共享和协作。然而&#xff0c;由于企业内部网段的复杂性和多样性&#xff0c;以及数据…

【JAVA】项目部署

IDEA部署maven&#xff1a;https://www.cnblogs.com/ckfuture/p/15821541.html MySQL数据库安装&#xff1a;https://blog.csdn.net/SoloVersion/article/details/123760428 SQLyog安装&#xff1a; https://blog.csdn.net/qq_43543789/article/details/107997510 git安装&a…

数字孪生平台

数字孪生平台 开放架构的价值数字孪生体和信息物理系统的对比对于数字孪生体的开放架构特点数字孪生体参考架构主要分为两部分 平台生态是数字经济的典型特征&#xff0c;由于数字技术具有网络效应&#xff0c;通过自建或参与数字平台&#xff0c;已成为所有数字技术企业必然的…

低代码平台:顺应时代的选择

低/无代码的高速发展&#xff0c;属于软件市场的选择&#xff0c;相较于传统编写代码的开发方式&#xff0c;它们开发效率更高、投入成本更低、技术门槛也更低&#xff0c;未来更多软件应用将使用低/无代码技术完成&#xff0c;这也是趋势。 身为开发人员经常需要花费大量时间在…

Windows下配置Poetry教程

发生时间&#xff1a;2023.09.16&#xff0c;按照官网的教程&#xff0c;配置系统环境根本找不到路径&#xff0c;所以自己研究了一番。 1.官网入口 https://python-poetry.org/docs/#installing-with-the-official-installer&#xff0c;找到Windows的安装命令 ⇒ 未安装过…

【物联网】常见电子元器件(电阻、电容、电感、二极管、三极管)综合,详细分析原理及其应用

电子元器件是现代电子技术的基础&#xff0c;它们在各个领域中发挥着重要作用。从三极管到电容器、电阻器&#xff0c;这些常用元器件承担着放大、开关、滤波等关键任务。它们的特性和组合方式决定了电路的性能和功能。本文将介绍常用电子元器件的工作原理和应用场景&#xff0…

如何简化第三方和临时用户的安全访问

保护第三方访问安全的重要性 在当今相互关联的业务环境中&#xff0c;与供应商、承包商、合作伙伴和供应商等外部各方进行协作已成为常态。进行协作往往要授予第三方内部系统、网络或数据的访问权限。但是&#xff0c;每个接入点都可能成为 IT 管理员的潜在漏洞&#xff0c;而…

Kibana server is not ready yet

查看kibana日志 docker logs kibana 找到error 翻译一下其实就是说磁盘空间满了导致es的这个索引变成只读模式了。 可以先去查看一下 进入到es中&#xff0c;可以看到占用了96% 命令是 # 查看es的容器id docker ps docker exec -it 容器id /bin/bash #进入到es里之后运行…

关于Controller继承Controller的效果与切面触发测试

关于继承Controller测试 首先创建一个Controller RestController RequestMapping(value"ceshi") public class CeshiController {GetMapping(value "ceshi")public String ceshi() {return "测试";} }创建一个Controller继承上一个Controller…

全面掌握应用程序性能的利器:性能监控软件

在当今数字时代&#xff0c;应用程序性能对于企业的成功至关重要。为了确保应用程序在高负载和压力下能够正常运行&#xff0c;并提供优质的用户体验&#xff0c;性能监控软件成为企业必备的利器。本文将介绍性能监控软件的重要性以及它们如何帮助企业全面掌握应用程序性能。 性…