SpringBoot自定义Starter及原理分析
目录
- 1.前言
- 2.环境
- 3.准备Starter项目
- 4.准备AutoConfigure项目
- 4.1 准备类HelloProperties
- 4.2 准备类HelloService
- 4.3 准备类HelloServiceAutoConfiguration
- 4.4 创建spring.factories文件并引用配置类HelloServiceAutoConfiguration
- 4.5 安装到maven仓库
- 5.在其他项目中引入自定义Starter测试
- 6.自动配置流程或原理
- 7.总结
1.前言
最近在看GeoServer Cloud源码时发现里面有很多自定义的Starter,有时候看的云里雾里。干脆自己也总结一下,写一个示例。
2.环境
之前作者遇到过一个问题,写Starter时环境是jdk8,也就是说写出来的是SpringBoot2插件,在jdk21即SpringBoot3应用中跑的时候总是报错java.lang.IllegalArgumentException: Unsupported class file major version 65,或者java.lang.NoClassDefFoundError: io/r2dbc/spi/ValidationDepth等等,反正各种问题。看来SpringBoot2和3之间的兼容性做的不是很好,我们以后要注意。因此作者索性调整了全部环境:
1.JDK8
2.IDEA2023
3.SpringBoot2.4.0
这里暂且留一个疑问,GeoServer Cloud项目是基于SpringBoot2.7.18的,jdk8就满足了,为什么非得要求jdk21?
3.准备Starter项目
这个Starter项目将来是要在其他项目里引用的。按照约定大于配置的思想,这里面不写任何代码,只是声明我们需要的依赖。新建一个普通的maven项目customer-starter即可。

然后引用我们的AutoConfigure项目即可,具体的项目我们下一步去完善。
<dependency><groupId>com.zhangier</groupId><artifactId>customer-starter-autoconfigure</artifactId><version>0.0.1</version>
</dependency>
4.准备AutoConfigure项目
好了,现在开始我们的重头戏。AutoConfigure项目要实现的是自动配置和打招呼。因此我们需要:
一个HelloService来提供sayHello方法
一个HelloProperties来绑定application.yaml中以hello开头的属性
一个HelloServiceAutoConfiguration来实现自动装配
现在我们来新建一个项目,因为是SpringBoot项目,因此在pom要声明parent和dependency

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version>
</parent>
<groupId>com.zhangier</groupId>
<artifactId>customer-starter-autoconfigure</artifactId>
<version>0.0.1</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>
</dependencies>
4.1 准备类HelloProperties
HelloProperties中只需要声明两个属性,前缀和后缀,即prefix和suffix,以便将来在打招呼时使用.使用@ConfigurationProperties注解来实现绑定以hello开头的配置。前缀和后缀我们都分别给了一个默认值Hi和Welcome。
@ConfigurationProperties("hello")
public class HelloProperties {private String prefix="Hi";private String suffix="Welcome";public String getPrefix() {return prefix;}public void setPrefix(String prefix) {this.prefix = prefix;}public String getSuffix() {return suffix;}public void setSuffix(String suffix) {this.suffix = suffix;}
}
4.2 准备类HelloService
HelloService中我们来实现一个sayHello方法,并使用@Autowired注解自动注入刚刚创建的HelloProperties.
public class HelloService {@AutowiredHelloProperties helloProperties;public String sayHello(String name){return helloProperties.getPrefix()+" "+name+" "+helloProperties.getSuffix();}
}
4.3 准备类HelloServiceAutoConfiguration
HelloServiceAutoConfiguration是一个配置类,需要干两件事,一是将HelloProperties放入到Spring容器中,二是判断容器中有没有HelloService,如果没有,就主动new一个出来放到容器中。
@Configuration//声明这是一个配置类
@EnableConfigurationProperties(HelloProperties.class)//进行属性绑定以后HelloProperties也放到容器中
public class HelloServiceAutoConfiguration {@ConditionalOnMissingBean(HelloService.class)//如果容器中没有HelloService@Bean//将返回值放入到容器中public HelloService helloService(){HelloService helloService=new HelloService();return helloService;}
}
4.4 创建spring.factories文件并引用配置类HelloServiceAutoConfiguration
这一步是最关键的,否则我们相当于上面一堆操作白干。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zhangiser.Properties.HelloServiceAutoConfiguration
4.5 安装到maven仓库
因为我们的Starter项目依赖AutoConfigure项目,因此我们先安装AutoConfigure


然后再安装Starter。


好了,现在我们的自定义Starter已经准备完毕了,接下来开始到另外一个项目进行测试。
5.在其他项目中引入自定义Starter测试
首先新建一个SpingBoot项目,勾选Spring Web模块。注意pom中除了要引用SpingBoot,还有引用我们刚刚创建的customer-starter
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.zhangier</groupId><artifactId>customer-starter</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
主类上使用@SpringBootApplication注解,意思这是一个SpingBoot项目。
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class App
{public static void main( String[] args ){SpringApplication.run(App.class,args);}
}
然后新建一个测试类
import com.zhangiser.Service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@AutowiredHelloService helloService;@RequestMapping("/hello")public String hello(String[] args) {return helloService.sayHello("张三");}
}
启动以后,访问一下看看效果

因为我们现在并没有在测试项目中写application.yaml文件,所以前后缀还是用的HelloProperties 的默认属性,现在创建一个application.yaml并修改一下前后缀,注意,我们给HelloProperties 绑定的是以hello开头的配置。我们把前缀改成你好,后缀改成热烈欢迎,重启一下服务再看效果。


perfect,变过来了,非常棒。
6.自动配置流程或原理
1.准备一个Starter项目,其中不写任何代码,只引入相关依赖
2.准备一个AutoConfigure项目,进行自动配置
3.使用@ConfigurationProperties注解进行属性前缀绑定
4.使用@Configuration注解声明配置类
5.使用@EnableConfigurationProperties注解进行配置文件到属性类的绑定并将属性类放入Spring容器
6.使用@ConditionalOnMissingBean或@ConditionalOnMissingClass等注解进行判断条件判断
7.使用@Bean注解将最终类放入到Spring容器
8.在spring.factories文件中指定配置类
9.在其他项目中引用pom并调用最终类
10.通过修改 application.properties 或 application.yaml等进行属性值的修改
7.总结
本文我们通过对SpringBoot的自动配置流程和原理进行分析,实现了一个自定义的Starter,这一点有利于我们在以后的工作中开展对GeoServer Cloud的源码分析,回见~
相关文章:
SpringBoot自定义Starter及原理分析
目录 1.前言2.环境3.准备Starter项目4.准备AutoConfigure项目4.1 准备类HelloProperties4.2 准备类HelloService4.3 准备类HelloServiceAutoConfiguration4.4 创建spring.factories文件并引用配置类HelloServiceAutoConfiguration4.5 安装到maven仓库 5.在其他项目中引入自定义…...
YOLOv10网络架构及特点
YOLOv10简介 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型组件,YOLOv…...
基于单片机的多功能智能小车设计
第一章 绪论 1.1 课题背景和意义 随着计算机、微电子、信息技术的快速发展,智能化技术的发展速度越来越快,智能化与人们生活的联系也越来越紧密,智能化是未来社会发展的必然趋势。智能小车实际上就是一个可以自由移动的智能机器人,比较适合在人们无法工作的地方工作,也可…...
Python时间序列分析库
Sktime Welcome to sktime — sktime documentation 用于ML/AI和时间序列的统一API,用于模型构建、拟合、应用和验证支持各种学习任务,包括预测、时间序列分类、回归、聚类。复合模型构建,包括具有转换、集成、调整和精简功能的管道scikit学习式界面约定的交互式用户体验Pro…...
算法设计与分析 实验1 算法性能分析
目录 一、实验目的 二、实验概述 三、实验内容 四、问题描述 1.实验基本要求 2.实验亮点 3.实验说明 五、算法原理和实现 问题1-4算法 1. 选择排序 算法实验原理 核心伪代码 算法性能分析 数据测试 选择排序算法优化 2. 冒泡排序 算法实验原理 核心伪代码 算…...
FPGA NET
描述 网络是一组相互连接的引脚、端口和导线。每条电线都有一个网名 识别它。两条或多条导线可以具有相同的网络名称。所有电线共享一个公用网络 名称是单个NET的一部分,并且连接到这些导线的所有引脚或端口都是电气的 有联系的。 当net对象在 将RTL源文件细化或编译…...
把服务器上的镜像传到到公司内部私有harbor上,提高下载速度
一、登录 docker login https://harbor.cqxyy.net/ -u 账号 -p 密码 二、转移镜像 minio 2024.05版 # 指定tag docker tag minio/minio:RELEASE.2024-05-10T01-41-38Z harbor.cqxyy.net/customer-software/minio:RELEASE.2024-05-10T01-41-38Z# 推送镜像 docker push harbo…...
1055 集体照(测试点3, 4, 5)
solution 从后排开始输出,可以先把所有的学生进行排序(身高降序,名字升序),再按照每排的人数找到中间位置依次左右各一个进行排列测试点3, 4, 5:k是小于10的正整数,则每…...
AI 定位!GeoSpyAI上传一张图片分析具体位置 不可思议! ! !
🏡作者主页:点击! 🤖常见AI大模型部署:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2024年6月16日12点23分 🀄️文章质量:94分…...
中国最著名的起名大师颜廷利:父亲节与之相关的真实含义
今天是2024年6月16日,这一天被广泛庆祝为“父亲节”。在汉语中,“父亲”这一角色常以“爸爸”、“大大”(da-da)或“爹爹”等词汇表达。有趣的是,“爸爸”在汉语拼音中表示为“ba-ba”,而当我们稍微改变“b…...
【每日刷题】Day66
【每日刷题】Day66 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 小乐乐改数字_牛客题霸_牛客网 (nowcoder.com) 2. 牛牛的递增之旅_牛客题霸_牛客网 (nowcoder.com)…...
工资信息管理系统的设计
管理员账户功能包括:系统首页,个人中心,基础数据管理,公告管理,津贴管理,管理员管理,绩效管理 用户账户功能包括:系统首页,个人中心,公告管理,津…...
Docker 镜像****后,如何给Ubuntu手动安装 docker 服务
Docker 镜像****后,如何给Ubuntu手动安装 docker 服务 下载地址下载自己需要的安装包使用下面的命令进行安装启动服务 最近由于某些未知原因,国内的docker镜像全部被停。刚好需要重新安装自己的笔记本为双系统,在原来的Windows下,…...
数组模拟单链表和双链表
目录 单链表 初始化 头插 删除 插入 双链表 初始化 插入右和插入左 删除 单链表 单链表主要有三个接口:头插,删除,插入(由于单链表的性质,插入接口是在结点后面插入) 初始化 int e[N], ne[N]; …...
【图解IO与Netty系列】Netty源码解析——服务端启动
Netty源码解析——服务端启动 Netty案例复习Netty原理复习Netty服务端启动源码解析bind(int)initAndRegister()channelFactory.newChannel()init(channel)config().group().register(channel)startThread()run()register0(ChannelPromise promise)doBind0(...) 今天我们一起来学…...
Python酷库之旅-比翼双飞情侣库(10)
目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …...
2024年全国青少信息素养大赛python编程复赛集训第二天编程题分享
整理资料不容易,感谢各位大佬给个点赞和分享吧,谢谢 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数…...
Java | Leetcode Java题解之第151题反转字符串中的单词
题目: 题解: class Solution {public String reverseWords(String s) {StringBuilder sb trimSpaces(s);// 翻转字符串reverse(sb, 0, sb.length() - 1);// 翻转每个单词reverseEachWord(sb);return sb.toString();}public StringBuilder trimSpaces(S…...
web前端教程全套:从入门到精通的全方位探索
web前端教程全套:从入门到精通的全方位探索 在数字时代的浪潮中,Web前端技术作为连接用户与数字世界的桥梁,日益受到重视。本文将围绕Web前端教程的全套内容,从四个方面、五个方面、六个方面和七个方面展开深入剖析,旨…...
什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
