系列十七、理解SpringBoot中的starter 自定义一个starter

news2025/2/28 5:22:58

一、概述

        作为后端Java程序员,基本上公司的日常开发都是基于SpringBoot进行的,我们使用SpringBoot也是沉醉于它的各种各样的starter带给我们的便利,这些starter为我们带来了众多的自动化配置,通过这些自动化配置,我们可以很容易地就可以搭建出一个生产级别的开发环境,那么starter到底是什么?它为什么这么神奇这么好用?接下来我会通过通俗易懂的语言 + 实战代码为大家介绍starter。

        所谓starter其实就是各个组织或者公司,为了整合springboot而对外提供的一个组件,本质上就是一个普普通通的maven项目,例如:mybatis-plus-boot-starter、druid-spring-boot-starter、pagehelper-spring-boot-starter等,它的底层是由Spring + SpringMVC中的基础组件实现的,其核心注解是条件注解 @Conditional 即:当classpath下符合某个条件该配置才会生效,例如:

二、自定义一个starter

2.1、步骤

        1、新建一个普通的maven项目(pom中需引入springboot的自动配置);

        2、创建一个HelloProperties类,用于接收application.yml或者application.properties中注入的值;

        3、定义一个HelloService,用来处理接收到的值;

        4、定义自动配置类;

        5、在resources/META-INF目录创建一个spring.factories文件,将自定义的自动配置配置进取;

        6、本地install后,再创建一个springboot工程,引入自定义的starter进行测试

2.2、案例

2.2.1、项目概览

2.2.2、pom

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-autoconfigure</artifactId>
		<version>2.1.8.RELEASE</version>
	</dependency>

	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.18</version>
	</dependency>
</dependencies>

2.2.3、HelloProperties

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description: 创建一个 HelloProperties 类,用来接受 application.properties 中注入的值
 *
 * @ConfigurationProperties(prefix = "titanic"):
 *      将application.properties或者application.yml中前缀为titanic的属性值自动注入到这个实例中
 */
@Data
@ConfigurationProperties(prefix = "titanic")
public class HelloProperties {
    private static final String DEFAULT_NAME = "JACK";
    private static final String DEFAULT_MESSAGE = "杰克";
    private String name = DEFAULT_NAME;
    private String message = DEFAULT_MESSAGE;
}

2.2.4、HelloService

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description: 
 * 
 */
@Data
public class HelloService {

    /**
     * 姓名
     */
    private String name;

    /**
     * 问候语
     */
    private String message;

    public String sayHello() {
        return name + ":" + message;
    }

}

2.2.5、HelloServiceAutoConfiguration

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description:
 *
 * @EnableConfigurationProperties(HelloProperties.class):使配置的@ConfigurationProperties(prefix = "titanic")生效,让配置的属性成功的进入bean
 * @ConditionalOnClass(HelloService.class):表示当项目的classpath路径存在HelloService时,后面的配置才会生效
 * 流程:
 *  1、自动配置类中首先注入HelloProperties,用于接收在application.yml或application.properties中配置的相关数据;
 *  2、提供一个HelloService实例,将HelloProperties中的值注入进去
 */
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {

    @Resource
    private HelloProperties helloProperties;

    @Bean
    public HelloService helloService() {
        HelloService helloService = new HelloService();
        helloService.setName(helloProperties.getName());
        helloService.setMessage(helloProperties.getMessage());

        return helloService;
    }

}

        题外话:配置到此,我们自定义的自动化配置类就算配好了,但是要想让我们自定义的自动化配置类生效,还需要在resources/META-INF目录创建一个spring.factories文件,文件中的值如下,那么为什么配置spring.factories后,我们自定义的starter就生效了?这块就涉及到SpringBoot的自动配置原理了,请参考前面的文章 系列十三、SpringBoot的自动配置原理分析  这里不再赘述。

2.2.6、spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.star.config.HelloServiceAutoConfiguration

2.2.7、安装到本地 

三、测试

3.1、步骤

        新建一个springboot项目,引入上述自定义的starter,在application.yml中配置相关信息进行测试即可!

3.1 、案例代码

3.1.1、项目概览

3.1.2、pom

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<dependency>
		<groupId>org.star</groupId>
		<artifactId>hello-spring-boot-starter</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
</dependencies>

3.1.3、HelloController

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description:
 */
@RestController
public class HelloController {

    @Resource
    private HelloService helloService;

    @GetMapping("/sayHello")
    public String sayHello() {
        return helloService.sayHello();
    }

}

3.1.4、application.yml

3.1.5、测试

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

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

相关文章

为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)

以为我这篇文章制作的游戏申请软件著作权为例 Ren‘py 视觉小说 交互式故事游戏制作过程学习笔记(Windows下实现)(多结局游戏)-CSDN博客 一、网站注册 申请软著时&#xff0c;所有的著作权人都需要在中国版权保护中心官网注册账号&#xff0c;并进行实名认证后&#xff0c;才…

使用WalletConnect Web3Modal v3 链接钱包基础教程

我使用的是vueethers 官方文档&#xff1a;WalletConnect 1.安装 yarn add web3modal/ethers ethers 或者 npm install web3modal/ethers ethers2.引用 新建一个js文件&#xff0c;在main.js中引入&#xff0c;初始化配置sdk import {createWeb3Modal,defaultConfig, } from…

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…

半监督语义分割综述

paper link&#xff1a;https://arxiv.org/pdf/2302.09899.pdf 1. Introduction 图像分割是最古老、研究最广泛的计算机视觉 (CV) 问题之一。图像分割是指将图像划分为不同的非重叠区域&#xff0c;并将相应的标签分配给图像中的每个像素&#xff0c;最终获得ROI区域位置及其类…

【智能家居】二、添加火灾检测模块(烟雾报警功能点)

可燃气体传感器 MQ-2 和 蜂鸣器 代码段 controlDevice.h&#xff08;设备控制&#xff09;smokeAlarm.c&#xff08;烟雾报警器&#xff09;buzzer.c&#xff08;蜂鸣器&#xff09;mainPro.c&#xff08;主函数&#xff09;运行结果 可燃气体传感器 MQ-2 和 蜂鸣器 代码段 …

基于机器深度学习的交通标志目标识别

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 智能交通系统&#xff08;ITS&#xff09;&#xff0c;包括无人驾驶车辆&#xff0c;尽管在道路…

OrangePi 5:ROS2 Humble中使用激光雷达

OrangePi 5&#xff1a;ROS2 Humble中使用激光雷达 文章目录 OrangePi 5&#xff1a;ROS2 Humble中使用激光雷达1、硬件准备2、ROS2 Humble安装2.1 使用集成脚本安装2.2 按ROS2官方指导安装2.3 ROS2安装验证 3、YDLIDAR X2激光雷达驱动安装3.1 YDLIDAR X2激光雷达介绍3.2 YDLID…

go第三方包发布(短精细)

1、清除其他依赖项 $ go mod tidy # 清除不必要的依赖依赖清除完成后&#xff0c;查看go.mod文件配置是否规范 module github.com/fyupeng/rpc-go-netty go 1.19 require ( )2、本地版本创建 $ git tag v0.1.0 # 本地 创建标签3、版本提交 $ git push github v0.1.0 # 推送…

Programming Contest 2023(AtCoder Beginner Contest 331)D题 Tile Pattern --- 题解

目录 D - Tile Pattern 题目大意&#xff1a; 思路&#xff1a; 代码&#xff1a; D - Tile Pattern D - Tile Pattern (atcoder.jp) 题目大意&#xff1a; 给你一个n和q&#xff0c;n为局部棋盘大小(n*n) 并且给出局部棋盘中黑白子位置的放置情况&#xff0c;q为查询次数…

Docker部署Plik临时文件上传系统并且实现远程访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik8. 结语 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上…

深入解析JVM内存结构:Metaspace、堆与垃圾收集器

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Flask使用线程异步执行耗时任务

1 问题说明 1.1 任务简述 在开发Flask应用中一定会遇到执行耗时任务&#xff0c;但是Flask是轻量级的同步框架&#xff0c;即在单个请求时服务会阻被塞&#xff0c;直到任务完成&#xff08;注意&#xff1a;当前请求被阻塞不会影响到其他请求&#xff09;。 解决异步问题有…

C语言--每日选择题--Day32

如果大家对读研究生和就业不知道如何抉择&#xff0c;我的建议是看大家的经济基础&#xff0c;如果家里不是很需要你们工作&#xff0c;就读研提升自己的学历&#xff0c;反之就就业&#xff1b;毕竟经济基础决定上层建筑&#xff1b; 第一题 1. 下面代码的结果是&#xff1a;…

Paxos 算法

Paxos 算法 介绍 Paxos 算法是第一个被证明完备的分布式系统共识算法。共识算法的作用是让分布式系统中的多个节点之间对某个提案&#xff08;Proposal&#xff09;达成一致的看法。提案的含义在分布式系统中十分宽泛&#xff0c;像哪一个节点是 Leader 节点、多个事件发生的…

百马百担c语言编程

以下是一个百马百担问题的C语言编程实现&#xff1a; #include <stdio.h>int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); int a[n], b[m], c[k]; for (int i 0; i < n; i) { scanf("%d", &a[i]);…

LangChain 18 LangSmith监控评估Agent并创建对应的数据库

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

ELK高级搜索,深度详解ElasticStack技术栈-下篇

前言&#xff1a;ELK高级搜索&#xff0c;深度详解ElasticStack技术栈-上篇 14. search搜索入门 14.1. 搜索语法入门 14.1.1 query string search 无条件搜索所有 GET /book/_search结果&#xff1a; {"took" : 969,"timed_out" : false,"_shar…

大数据湖项目建设方案:文档全文101页,附下载

关键词&#xff1a;大数据解决方案&#xff0c;数据湖解决方案&#xff0c;数据治理解决方案&#xff0c;数据中台解决方案 一、大数据湖建设思路 1、明确目标和定位&#xff1a;明确大数据湖的目标和定位是整个项目的基础&#xff0c;这可以帮助我们确定项目的内容、规模、所…

Mybatis 分页查询的三种实现

Mybatis 分页查询 1. 直接在 sql 中使用 limit2. 使用 RowBounds3. 使用 Mybatis 提供的拦截器机制3.1 创建一个自定义拦截器类实现 Interceptor3.2 创建分页查询函数 与 sql3.3 编写拦截逻辑3.4 注册 PageInterceptor 到 Mybatis 拦截器链中3.5 测试 准备一个分页查询类 Data…

算法工程师面试八股(搜广推方向)

文章目录 机器学习线性和逻辑回归模型逻辑回归二分类和多分类的损失函数二分类为什么用交叉熵损失而不用MSE损失&#xff1f;偏差与方差Layer Normalization 和 Batch NormalizationSVM数据不均衡特征选择排序模型树模型进行特征工程的原因GBDTLR和GBDTRF和GBDTXGBoost二阶泰勒…