自定义一个SpringBoot starter 怎么实现

文章目录

  • 1、创建一个空项目
  • 2、在新建的空项目中添加starter模块
  • 3、添加autoconfigure模块
  • 4、配置starter模块的pom文件
  • 5、配置autoconfigure模块
    • 1. 配置pom依赖
    • 2、创建xxProperties配置类
    • 3、创建服务提供类xxxService
    • 4、创建自动配置类xxxGenerateAutoConfiguration
    • 5 、META-INF/spring.factories
    • 6、打包
  • 6、测试
  • 7、总结创建步骤

1、创建一个空项目

首先创建一个空的Project。用以承载starter和autoconfigure
在这里插入图片描述
在这里插入图片描述

2、在新建的空项目中添加starter模块

在这里插入图片描述
创建一个maven项目
在这里插入图片描述

在这里插入图片描述

3、添加autoconfigure模块

这里因为是要借助Spring Boot做自动配置,就可以直接使用Spring Initializer来创建。
在这里插入图片描述
在这里插入图片描述
Package:com.yhz.starter.autoConfigure
后面一路点击Next,最后,直接点finish就OK了
在这里插入图片描述
添加完模块后,一定先点Apply,再点OK,否则白干

如果autoconfigure模块下的pom文件是红的:
在这里插入图片描述
鼠标右击该pom文件,点靠近最下方的,Add as Maven Project 就好了
在这里插入图片描述

4、配置starter模块的pom文件

 <dependencies><dependency><groupId>com.yhz</groupId><artifactId>yhz-spring-boot-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>

刷新maven。

5、配置autoconfigure模块

Either way, your starter must reference the core Spring Boot starter (spring-boot-starter) directly or indirectly (i.e. no need to add it if your starter relies on another starter). If a project is created with only your custom starter, Spring Boot’s core features will be honoured by the presence of the core starter.
无论哪种方式,您的启动器都必须直接或间接引用核心Spring Boot启动器(Spring Boot起动器)(即,如果您的启动器依赖于另一个启动器,则无需添加它)。如果一个项目只使用您的自定义启动器创建,那么Spring Boot的核心功能将因核心启动器的出现而受到表彰。百度翻译的

这个模块只用来配置,所以可以把其他无关的文件删掉:
在这里插入图片描述

1. 配置pom依赖

将test的依赖删掉,在pom文件中添加spring-boot-configuration-processor依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

作用是:
确保在使用@ConfigurationProperties注解时,可以优雅的读取配置信息,引入该依赖后,IDEA不会出现“spring boot configuration annotation processor not configured”的错误。

2、创建xxProperties配置类

package com.yhz.starter.autoConfigure;import org.springframework.boot.context.properties.ConfigurationProperties;/*** @BelongsProject: spring-boot-starter-test* @Author: YHZ* @CreateTime: 2023-07-17  17:45* @Description: TODO* @Version: 1.0*/
@ConfigurationProperties(prefix = MyProperties.PREFIX)
public class MyProperties {public static final String PREFIX = "yhz";private Long workId;public Long getWorkId() {return workId;}public void setWorkId(Long workId) {this.workId = workId;}
}

这里注解 @ConfigurationProperties 表示这是一个配置文件,其中的属性字段可以在application.properties中指定。prefix =MyProperties.PREFIX表示匹配 yhz前缀。例如这里,我们将来使用的时候就可以通过配置yhz.workId=xxx来配置前缀。

3、创建服务提供类xxxService

表示我们这个starter可以提供的服务

package com.yhz.starter.autoConfigure;import java.util.Random;/*** @BelongsProject: spring-boot-starter-test* @Author: YHZ* @CreateTime: 2023-07-17  17:56* @Description: TODO* @Version: 1.0*/
public class MyGenerateService {private Long workId;public MyGenerateService(Long workId) {this.workId = workId;}public Long generate() {return new Random().nextInt(100) + this.workId;}
}

4、创建自动配置类xxxGenerateAutoConfiguration

package com.yhz.starter.autoConfigure;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @BelongsProject: spring-boot-starter-test* @Author: YHZ* @CreateTime: 2023-07-17  17:58* @Description: TODO* @Version: 1.0*/
// 必须,指明这是一个配置类
@Configuration
// 必须,绑定我们的配置文件类
@EnableConfigurationProperties(MyProperties.class)
// 可选,表示可以在配置文件中,通过 myGenerateService.enable来设置是否配置该类
// 如果没有指明,则默认为true,即表示配置,如果指明为false,就不配置了
@ConditionalOnProperty(prefix = "myGenerateService", value = "enable", matchIfMissing = true)
public class MyGenerateAutoConfiguration {@Autowiredprivate MyProperties myProperties;//    用@Bean将 MyGenerateService 注入到Spring容器中,并把配置文件传进去,以供 MyGenerateService 使用@Beanpublic MyGenerateService myGenerateService(){return new MyGenerateService(myProperties.getWorkId());}}

5 、META-INF/spring.factories

Spring Boot的自动配置会自动加载类路径下META-INF/spring.factories文件,并将以类EnableAutoConfiguration的全限定类名对应的值作为候选配置类。所以这里还需要新建该文件。
在main目录下新建一个resource目录
在这里插入图片描述
创建spring.factories文件
在这里插入图片描述
文件中填入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.yhz.starter.autoConfigure.MyGenerateAutoConfiguration

这样,Spring Boot就能自动扫描到我们这个配置类并加载了。

6、打包

编写完后,将两个模块打包发布到maven仓库,先将autoconfigure模块打包,再将starter模块打包
在这里插入图片描述
到此,自定义starter就算完成了

6、测试

新建一个测试模块
在这里插入图片描述
在这里插入图片描述
添加一个web依赖,通过浏览器调用接口,查看结果
在这里插入图片描述
新建完成后,在test模块的pom文件里,添加我们刚才上传的starter,刷新maven。

		<dependency><groupId>com.yhz</groupId><artifactId>yhz-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency>

在这里插入图片描述
可以在application.properties文件中,做自定义配置

yhz:workId: 100086

创建一个TestController
在这里插入图片描述

@RestController
@RequestMapping("/test")
public class TestController {@Autowiredprivate MyGenerateService myGenerateService;@RequestMapping("starter")public Long starter(){//调用 自定义starter中myGenerateService的generate方法return myGenerateService.generate();}
}

启动项目,浏览器输入http://localhost:8080/test/starter
在这里插入图片描述
说明我们确实可以使用myGenerateService的服务,并且可以自定义前缀。

7、总结创建步骤

规范的starter包含两个model,一个autoconfigure,提供自动配置代码,一个starter,会加载 autoconfigure,并提供启动所需的所有依赖。

  1. 定义一个starter模块和autoconfigure模块,starter模块依赖autoconfigure模块,并提供启动所需的依赖。starter模块不提供服务。
  2. 定义Starter需要的配置类(Properties)xxxProperties
  3. 编写Starter项目的业务功能xxxService
  4. 编写自动配置类xxAutoConfigure
  5. 编写spring.factories文件,把自己的配置类全类名绑定到Spring Boot自动配置类的全类名上
  6. 打包安装
  7. 其它项目引用

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux图形界面总结——X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考&#xff1a; 一、 linux图形界面 linux本身没有图形界面&#xff0c;linux现在的图形界面的实现只是linux下的应用程…

linux驱动开发:驱动开发框架,linux内核字符设备驱动开发过程

一、驱动框架 1.Linux内核模块和字符驱动的关系 模块是Linux进行组建管理的一种方式, 结构体:对设备的管理内核需要抽象出来一个结构体来描述设备所有的共性信息写驱动需要申请一个结构体并赋值(初始化),然后注册给内核让内核统一管理 驱动:由内核统一管理,所以驱动…

RabbitMQ实现六类工作模式

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; RabbitMQ实现六类工作模式 ⏱️ 创作时间&#xff1a; 2023年07月20日…

图像处理之梯度及边缘检测算子

文章目录 一、sobel 算子二、Scharr算子三、Roberts算子四、拉普拉斯算子 梯度是一个量变化的速度&#xff0c;在数学中通常使用求导、求偏导获取梯度或者某一方向上的梯度。 在数字图像中梯度可以看为像素值分别在x,y方向上的变化速度&#xff0c;因为数字图像的离散型&#x…

微软浏览器连不上网络

针对微软浏览器连不上网络&#xff0c;但其他浏览器仍能连上网络 控制面板 -> 网络和Internet -> Internet 选项 -> 连接 -> 局域网设置 -> 取消代理服务器

SQL数据库(设置模式、数据库操作、表操作、列操作、SQL索引/约束、SQL数据类型、SQL函数、常见问题)

目录 SQL数据库 设置模式 SET NAMES utf-8 set sql_safe_updates1 数据库操作 CREATE DATABASE databaseName&#xff08;创建数据库&#xff09; USE databaseName&#xff08;选择数据库&#xff09; DROP DATABASE databaseName&#xff08;删除数据库&#xff09; …

[pyqt5]鼠标指针光标样式

pyqt5默认有下面几种光标样式 设置光标&#xff1a; self.setCursor(Qt.CrossCursor) 恢复默认光标 self.unsetCursor() 自定义光标 from PyQt5.Qt import * import sysapp QApplication(sys.argv)# 创建一个控件 window QWidget() window.resize(500,500) window.move(…

指针知多少

作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;Python等 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1f495; ⛵前言 不知道大家还记…

【深度学习】多任务学习

多任务学习是一个很火的话题&#xff0c;在自动驾驶领域以及其他对存储资源要求较高的端侧任务&#xff0c;都会考虑这种方式。之前面试的时候也有被问题多任务学习。前几天看到一个写得很好的例子&#xff0c;在此记录一下&#xff0c;也好久没有写博客了。 1.参考 论文是20…

p2p大豆计数模型

前面学习了一下论文&#xff1a;Improved Field-Based Soybean Seed Counting and Localization with Feature Level Considered 论文链接&#xff1a;https://spj.science.org/doi/10.34133/plantphenomics.0026 解读链接&#xff1a;论文阅读--考虑特征水平的改进的基于田间…

如何在 3ds Max 中使用 Mental Ray 制作逼真的草地和带有光晕的天空

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 首先&#xff0c;您将创建一个平面对象&#xff0c;然后添加一个噪点修改器。在此之上应用毛发和毛皮修饰符。 这将用于模拟逼真的草地。 我们用日光系统创造太阳和天空。为太阳添加镜头和戒指效果以及酷炫…

ES6类-继承-Symbol-模版字符串

目录 类 继承 ES5 如何继承 ES6继承 Symbol 用途 可以产生唯一的值&#xff0c;独一无二的值 解决命名冲突 getOwnPropertySymbols() 作为全局注册表 缓存 Symbol.for() 消除魔术字符串 模版字符串 类 在javascript语言中&#xff0c;生成实例对象使用构造函数&#xf…