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

一、概述

        作为后端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 {@Resourceprivate HelloProperties helloProperties;@Beanpublic 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 {@Resourceprivate HelloService helloService;@GetMapping("/sayHello")public String sayHello() {return helloService.sayHello();}}

3.1.4、application.yml

3.1.5、测试

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

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

相关文章

miot-plugin-sdk 使用echart图表插件

1.安装 echart npm install native-echarts --save2.引用 import Echarts from native-echarts;3.把option封装成函数 echart(val,title){option {tooltip: {formatter: {a} <br/>{b} : {c}%},series: [{name: Pressure,type: gauge,detail: {formatter: {value}},dat…

c语言-快速排序

目录 一、实现快速排序三种方法 1、hoare法 2、挖坑法 3、双指针法 4、快速排序的优化 5、测试对比 结语&#xff1a; 前言&#xff1a; 快速排序作为多种排序方法中效率最高的一种&#xff0c;其底层原理被广泛运用&#xff0c;他的核心思想与二叉树结构中的递归逻辑相似…

30秒搞定一个属于你的问答机器人,快速抓取网站内容

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 文章目录 简介运行效果GitHub地址 简介 爬取一个网站的内容&#xff0c;然后让这个内容变成你自己的私有知识库&#xff0c;并且还可以搭建一个基于私有知识库的问…

没有预装Edge浏览器的Windows系统安装Edge正式版的方法,离线安装和在线安装

一、在线安装 没有预装Edge浏览器的Windows系统安装Edge正式版的方法 二、离线安装 进入到下面这个目录 C:\Program Files (x86)

DEXP DIMP导出导入备份

DEXP & DIMP导出导入备份 导出导入示例可用参数一览 导出导入示例 将数据库的KNOWDB模式下下的所有数据库对象导出到/home/dmdba/路径下的dmp文件中&#xff1a; cd /dameng/app/v8/bin/ ./dexp USERIDSYSDBA/SYSDBA FILEknowdb_20231122.dmp LOGdexp.log \ DIRECTORY/h…

【Web】NISACTF 2022 个人复现

目录 ①easyssrf ②babyupload ③ level-up ④bingdundun~ 明天就新生赛了&#xff0c;练套题保持下手感吧 &#xff08;文章只选取了一部分&#xff09; ①easyssrf 输入/flag 输入file:///fl4g 访问/ha1x1ux1u.php ?filephp://filter/convert.base64-encode/resource/…

UI自动化Selenium OCR库:ddddocr识别验证码

一、安装ddddocr 通过命令将自动安装 pip install ddddocr 如果速度慢&#xff0c;可用国内镜像&#xff0c;命令如下&#xff1a; pip install ddddocr -i Simple Index 二、使用实例 import ddddocr# 验证码识别 def ocrImg2(self, locate, locateTypeBy.XPATH):# 获取验…

手写VUE后台管理系统6 - 支持TS声明文件.d.ts

TS 使用声明文件进行类型定义。 配置 在 tsconfig.json 文件中&#xff0c;找到 include 属性&#xff0c;添加 "src/**/*.d.ts"&#xff0c;表示 src 目录下的所有 .d.ts 文件都会被自动加载。 添加后内容如下 "include": ["src/**/*.ts",&…

C++利剑string类(详解)

前言&#xff1a;大家都知道在C语言里面的有 char 类型&#xff0c;我接下来要讲的 string 类功能是使用 char 类型写的类&#xff0c;当然这个是C官方写的&#xff0c;接下来我们将会学会使用它&#xff0c;我们会发现原来 char 这种类型是还能这么好用&#xff0c;授人以…

Linux C语言 31-网络编程之TCP例程

Linux C语言 31-网络编程之TCP例程 本节关键字&#xff1a;C语言 网络编程 套接字操作 TCP协议 服务端 客户端 非阻塞 相关C库函数&#xff1a;setsockopt, socket, bind, listen, accept, recv, send, close, select, connect 相关接口介绍 Linux C语言 30-套接字操作 例程…

【VerilogVCS仿真_2023.11.15】

HDL&#xff1a;硬件描述语言&#xff0c;并发&#xff0c;时序RTL&#xff1a;寄存器传输级语言 Verilog和VHDL的区别&#xff1a;VHDL侧重于系统级描述——系统级设计人员所采用&#xff0c;Verilog侧重于模块行为的抽象描述——电路级设计人员 前端&#xff1a;系统级、算法…

linux上编写进度条

目录 一、预备的两个小知识1、缓冲区2、回车与换行 二、倒计时程序三、编写入门的进度条四、编写一个正式的五、模拟实现和下载速度相关的进度条 一、预备的两个小知识 1、缓冲区 首先认识一下缓冲区&#xff1a;先写一个.c文件如下&#xff1a; 我们执行一下这个程序时&…

【产品应用】一体化伺服电机在摆轮分拣机中的应用

随着物流和制造业的快速发展&#xff0c;分拣机的应用越来越广泛。摆轮分拣机作为一种常见的分拣设备&#xff0c;具有高效、准确、灵活等特点&#xff0c;被广泛应用于各类物流分拣场景。而一体化伺服电机在摆轮分拣机中的应用&#xff0c;为分拣机的性能提升和优化提供了新的…

专业视频剪辑利器Final Cut Pro for Mac,让你的创意无限发挥

在如今的数字时代&#xff0c;视频内容已经成为人们生活中不可或缺的一部分。无论是在社交媒体上分享生活点滴&#xff0c;还是在工作中制作专业的营销视频&#xff0c;我们都希望能够以高质量、高效率地进行视频剪辑和制作。而Final Cut Pro for Mac作为一款专业级的视频剪辑软…

6.5 Windows驱动开发:内核枚举PspCidTable句柄表

在 Windows 操作系统内核中&#xff0c;PspCidTable 通常是与进程&#xff08;Process&#xff09;管理相关的数据结构之一。它与进程的标识和管理有关&#xff0c;每个进程都有一个唯一的标识符&#xff0c;称为进程 ID&#xff08;PID&#xff09;。与之相关的是客户端 ID&am…

【蓝桥杯软件赛 零基础备赛20周】第6周——栈

文章目录 1. 基本数据结构概述1.1 数据结构和算法的关系1.2 线性数据结构概述1.3 二叉树简介 2. 栈2.1 手写栈2.2 CSTL栈2.3 Java 栈2.4 Python栈 3 习题 1. 基本数据结构概述 很多计算机教材提到&#xff1a;程序 数据结构 算法。 “以数据结构为弓&#xff0c;以算法为箭”…

uniapp uview u-input在app(运行在安卓基座上)上不能动态控制type类型(显隐密码)

开发密码显隐功能时&#xff0c;在浏览器h5上功能是没问题的 <view class"login-item-input"><u-input:type"showPassWord ? password : text"style"background: #ecf0f8"placeholder"请输入密码"border"surround&quo…

麻吉POS集成:如何无代码开发实现电商平台和CRM系统的高效连接

麻吉POS集成的前沿技术&#xff1a;无代码开发 在竞争激烈的电商市场中&#xff0c;商家们急需一种高效且易于操作的技术手段来实现系统间的快速连接与集成。麻吉POS以其前沿的无代码开发技术&#xff0c;让这一需求成为可能。无代码开发是一种允许用户通过图形用户界面进行编…

LiteOS内存管理:TLSF算法

问题背景 TLSF算法主要是面向实时操作系统提出的&#xff0c;对于RTOS而言&#xff0c;执行时间的确定性是最根本的&#xff0c;然而传统的动态内存分配器&#xff08;DMA&#xff0c;Dynamic Memory Allocator&#xff09;存在两个主要问题&#xff1a; 最坏情况执行时间不确…

【LeetCode】栈和队列OJ题---C语言版

栈和队列OJ题 1.括号匹配问题&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a; 2.用队列实现栈&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&…