自定义一个SpringBoot starter 怎么实现

news2024/11/28 8:36:56

文章目录

  • 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 {
    @Autowired
    private MyProperties myProperties;

//    用@Bean将 MyGenerateService 注入到Spring容器中,并把配置文件传进去,以供 MyGenerateService 使用
    @Bean
    public 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 {
	
    @Autowired
    private 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.coloradmin.cn/o/763906.html

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

相关文章

pgrouting 管线 联通分析

背景描述 啦啦啦啦&#xff0c;然后拉拉阿里&#xff0c;然后啦啦啦&#xff0c;最后就写了这个记录一下 数据准备 1 管线数据 数据要求&#xff08;拓扑检查&#xff09; 数据没有重叠要求 数据悬挂点问题得到合理结局&#xff0c;不存在数据连接点不一样的线 数据能按…

C. Fighting Tournament - 模拟+思维

分析&#xff1a; 每次两个数比较&#xff0c;大的留下&#xff0c;小的放后面&#xff0c;可以发现只要最大的到了第一位就只能是它赢&#xff0c;因此统计第一次遍历所有数组元素的赢的次数&#xff0c;如果查询是最大的数呢么就在加上k-n&#xff0c;赛时代码写的一团乱&…

适合投资者的交易策略,4步找到

在外汇交易市场中&#xff0c;根据市场情况和个人投资目标&#xff0c;制定灵活的交易策略是至关重要的。Forexclub认为投资者可以通过结合多种交易策略&#xff0c;打造出全面、科学且适合自己的外汇交易策略。 首先&#xff0c;基于技术指标的交易策略是判断市场趋势和转折点…

「数字化制造」 是如何让制造过程信息化的?

「数字化制造」 是如何让制造过程信息化的&#xff1f; 数字化制造是指利用数字技术和信息化手段来实现制造过程的智能化、自动化和高效化。 它通过将传感器、物联网、云计算、大数据分析、人工智能等先进技术与制造业相结合&#xff0c;实现生产过程的数字化、网络化和智能化…

【原创】实现ChatGPT中Transformer模型之Encoder-Decoder

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 Transformer Block &#xff08;通用块&#xff09;实现 看以上整个链路图&#xff0c;其实我们可以很清晰看到这心其实在Encoder环节里面主要是有几个大环节&#xff0c;每一层主要的核心作用如下&#xff1a; Multi-he…

Flask 分页Demo

项目结构 app.py from flask import Flask, render_template, requestapp Flask(__name__)books [{title: Book 1, author: Author 1, year: 2020},{title: Book 2, author: Author 2, year: 2021},{title: Book 3, author: Author 3, year: 2022},{title: Book 4, author: …

《面试1v1》面试官让我讲一下Kafka的性能哪里好

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

公钥加密之『迪菲–赫尔曼密钥交换』,颜色混合的把戏

前奏&#xff1a; 迪菲-赫尔曼密钥交换是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。 颜色混合&#xff1a; 如图所示&#xff0c;蛇和老鼠要交换一个共享密钥&…

Springboot热部署相关功能

文章目录 前言一、Springboot如何在IDEA中开启热部署二、热部署的相关知识1.热部署的范围2.关闭热部署 前言 环境是Mac电脑下的IDEA 2023.1.X版本 如何在修改程序后自动进行加载修改后的程序而不是重启加载所有资源而更新程序&#xff0c;这就使用到了Springboot相关的热部署功…

120页商业银行企业级IT架构规划ppt

导读&#xff1a;原文《商业银行企业级IT架构规划ppt》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取完整的电…

2023年7月17日,比较器,TreeMap底层,LinkedHashMap,Set接口

比较器 Comparator是外部比较器&#xff0c;用于比较来对象与对象之间的&#xff0c;两个对象进行比较&#xff0c;多用于集合排序 Comparable可以认为是一个内比较器&#xff0c;根据对象某一属性进行排序的。 1. 使用场景 ​ 内置比较器&#xff08;Comparable&#xff09;的…

Windows10下ChatGLM2-6B模型本地化安装部署教程图解

随着人工智能技术的不断发展&#xff0c;自然语言处理模型在研究和应用领域备受瞩目。ChatGLM2-6B模型作为其中的一员&#xff0c;以其强大的聊天和问答能力备受关注&#xff0c;并且最突出的优点是性能出色且轻量化。然而&#xff0c;通过云GPU部署安装模型可能需要支付相应的…

手把手带你创建微服务项目

1.先创建以下项目结构 2.在父项目中导入以下依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Web依赖 --><dependency>&l…

关于Java集合框架的总结

关于Java集合框架的总结 本篇文章先从整体介绍了java集合框架包含的接口和类&#xff0c;然后总结了集合框架中的一些基本知识和关键点&#xff0c;并结合实例进行简单分析。当我们把一个对象放入集合中后&#xff0c;系统会把所有集合元素都当成Object类的实例进行处理。从JDK…

分享四款导航页 个人主页html源码

一、开源免费&#xff0c;可以展示很多社交账号&#xff0c;也可以更换社交账号图标指向你的网站&#xff0c;上传后即可使用 https://wwwf.lanzout.com/ik7R912s031g 二、开源免费&#xff0c;不过部署稍微麻烦点 https://wwwf.lanzout.com/iCq2u12s02wb 三、适合做成导航页面…

Android性能优化篇[谷歌官方]

网上看到了个和Android性能优化相关的系列文章&#xff0c;觉的还不错&#xff0c;和大家分享下。 在Android领域&#xff0c;性能永远是一块大头。市场对这类人才的需求也是有增不减&#xff0c;而且薪资待遇也不错。如果大家想深入学习Android某个领域&#xff0c; 那性能这块…

190 → 169,50天瘦20斤随感

一头猪瘦二十斤没有人会在意&#xff0c;但一个人猛地瘦二十斤或许就会有意思~ 从五月底到7月中旬&#xff0c;大致50天瘦了21斤。本文大致从我自己的感想、方法、减肥前后的心态及身体变化等方面来给予你一些关键信息&#xff0c;希望对你有用吧。 当你发现自己真的在一斤一斤…

react CSS :last-child 最后一个下边框线如何去掉

需求&#xff1a;调用分类接口后&#xff0c;tab的最后一个border不要横线。 代码如下 逻辑是 i是否等于books数组的长度-1。 books.map((book, i) > { return( <View style{borderBottom:idx ! dictype.length - 1 && "1px solid #ECEFF7"} key…

CentOS7 mariadb10.x 安装

1、添加mariabd yum源 vi /etc/yum.repos.d/mariadb.repo [mariadb] name MariaDB baseurl https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.5/centos7-amd64/ gpgkey https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck 12、建立yum…

EMC学习笔记(十六)射频PCB的EMC设计(三)

射频PCB的EMC设计&#xff08;三&#xff09; 1.布线1.1 阻抗控制2.2 转角1.3 微带线布线1.4 微带线耦合器1.5 微带线功分器1.6 微带线基本元件1.7 带状线布线1.8 射频信号走线两边包地铜皮 2.其他设计考虑 1.布线 1.1 阻抗控制 PCB信号走线的阻抗与板材的介电常数、PCB结构、…