系列十七、理解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.hqwc.cn/news/239408.html

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

相关文章

mysql中除了InnoDB以外的其它存储引擎

参考资料&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html MyISAM存储引擎 https://dev.mysql.com/doc/refman/8.0/en/myisam-storage-engine.html MyISAM 存储引擎是基于比较老的ISAM存储引擎&#xff08;ISAM已经不再可用&#xff09;&#xff…

[论文精读]利用大语言模型对扩散模型进行自我修正

本博客是一篇最新论文的精读&#xff0c;论文为UC伯克利大学相关研究者新近(2023.11.27)在arxiv上上传的《Self-correcting LLM-controlled Diffusion Models》 。 内容提要: 现有的基于扩散的文本到图像生成模型在生成与复杂提示精确对齐的图像时仍然存在困难,尤其是需要数值和…

前缀和 LeetCode1094 拼车

1094. 拼车 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接…

SATA模块物理层OOB信号分析总结(三)

目录 一、简介二、总体解析2.1 OOB作用2.2 OOB信号的组成2.3 总体phy link过程2.4 整体PHY LINK Trace2.5 PHY LINK状态查询 三、其他相关链接1、SATA模块之HBA卡开发总结&#xff08;一&#xff09;2、SATA信息传输FIS结构总结&#xff08;二&#xff09;3、PCIe物理层总结-PC…

什么是CAS, 什么是AQS

文章目录 什么是CAS, 什么是AQSCASAQS 什么是CAS, 什么是AQS CAS AQS AQS 全称是AbstractQueuedSynchronizer&#xff0c; 是juc 下一个核心的抽象类&#xff0c;用于构建各种同步器和锁 比如我们熟悉的 ReentrantLock、ReadWriteLock、CountDownLatch等等是基于AQS. 首先在…

大数据技术之Oozie

大数据技术之Oozie 第1章 Oozie简介 Oozie英文翻译为&#xff1a;驯象人。一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache&#xff0c;提供对Hadoop MapReduce、Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。主要用于定时调度任…

北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(2)彩虹呼吸灯

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 二.管脚分配 三.实验效果 一.代…

OBS Studio 30.0 正式发布:支持 WebRTC

导读OBS Studio 30.0 已正式发布。此版本移除了对 Ubuntu 20.04、Qt 5 和 FFmpeg 4.4 之前版本的支持。 OBS Studio 30.0 已正式发布。此版本移除了对 Ubuntu 20.04、Qt 5 和 FFmpeg 4.4 之前版本的支持。 主要变化包括&#xff1a; 支持 WebRTC&#xff08;详情查看 OBS Stu…

shell 脚本计算距离最近的坐标

shell 脚本计算距离最近的坐标 坐标数据文件geo.log格式如下&#xff1a; beijing(116.405285,39.904989) tinajin(117.190182,39.125596) hebei(114.502461,38.045474) shanxi(112.549248,37.857014) neimenggu(111.670801,40.818311) liaoning(123.429096,41.796767) jilin(1…

一线大厂Redis高并发缓存架构

场景1&#xff1a;秒杀库存场景&#xff0c; 10000人抢100个商品 如果用普通的分布式锁实现&#xff0c; 最后抢到的人&#xff0c;要等前面99个人抢完 优化方案&#xff1a;可用分段锁&#xff0c; 降低锁的粒度&#xff0c; 比如1-10库存用锁product:101_1,11-20库存用锁pr…

LeetCode(47)合并区间【区间】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 合并区间 1.题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…

【Matlab】如何快速入门一项新技能-以Matlab/Simulink入门为例

目录 1. 引言 2. 背景 3. 快速学习并完成开发 3.1 了解需求&#xff0c;知道要干什么 3.2 了解Matlab/Simulink基本功能 第一步&#xff0c;查看Matlab的中文网站中文网站https://www.ilovematlab.cn/resources/对Matlab/Simulink有了一个初步认识。 3.3 实现一个最简单…