当前位置: 首页 > article >正文

手写一个最小 Starter:从 0 到能看懂

一、我们先定目标我们做一个最简单的 starter名字叫ark-hello-starter功能非常简单用户只要引入这个 starter就能直接注入一个HelloService来调用。像这样Autowired private HelloService helloService;然后System.out.println(helloService.sayHello());输出hello from ark starter二、你先理解starter 到底拆成什么最小 starter核心就 3 样东西1一个普通业务类比如HelloService2一个自动配置类比如HelloAutoConfiguration3一个配置注册文件告诉 Spring Boot“启动时把我的自动配置类也拿去加载”三、整体结构先看懂你可以先把 starter 理解成这个目录ark-hello-starter ├── src/main/java │ └── com/ark/starter │ ├── service │ │ └── HelloService.java │ └── autoconfigure │ └── HelloAutoConfiguration.java └── src/main/resources └── META-INF/spring └── org.springframework.boot.autoconfigure.AutoConfiguration.imports四、第一步写一个最普通的服务类这个类本身一点都不神秘就是个普通 Java 类package com.ark.starter.service; public class HelloService { public String sayHello() { return hello from ark starter; } }五、第二步写自动配置类这一步才是 starter 的关键。package com.ark.starter.autoconfigure; import com.ark.starter.service.HelloService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class HelloAutoConfiguration { Bean public HelloService helloService() { return new HelloService(); } }你先别管复杂的条件注解。先只看本质自动配置类 启动时帮你把 Bean 放进 Spring 容器也就是以前你要手动写Configuration public class MyConfig { Bean public HelloService helloService() { return new HelloService(); } }现在 starter 帮你写好了。六、第三步注册自动配置类这一步最重要也是很多人第一次最陌生的地方。在这个文件里写src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports内容com.ark.starter.autoconfigure.HelloAutoConfiguration这一句的意思就是“Spring Boot 启动时请把这个自动配置类也加载进来。”七、到这里 starter 就成了你现在回头看其实 starter 没有你想象中那么玄学。本质就是普通类 自动配置类 自动配置注册文件八、再升级一步加上 ConditionalOnClass现在我们把你前面学的东西塞进来。比如改成这样package com.ark.starter.autoconfigure; import com.ark.starter.service.HelloService; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration ConditionalOnClass(HelloService.class) public class HelloAutoConfiguration { Bean public HelloService helloService() { return new HelloService(); } }虽然这个例子里HelloService.class本来就在 starter 里条件判断意义不大但它是为了让你先看懂这个形式。它表达的是只有类存在配置才生效。企业里常见的是判断第三方依赖比如ConditionalOnClass(RedisTemplate.class)意思就是只有项目里引入了 Redis 相关类我才自动配置 Redis 功能。九、再升级一步避免用户自己定义了同名 Bean再加一个很常见的注解ConditionalOnMissingBean改成这样package com.ark.starter.autoconfigure; import com.ark.starter.service.HelloService; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration ConditionalOnClass(HelloService.class) public class HelloAutoConfiguration { Bean ConditionalOnMissingBean public HelloService helloService() { return new HelloService(); } }这句话的意思如果用户自己没定义HelloService我才给他自动创建。这个非常重要因为 starter 不能太霸道。十、现在你彻底理解一下运行流程用户项目一启动Spring Boot 干了这些事1. 启动应用2. 读取 AutoConfiguration.imports3. 发现 HelloAutoConfiguration4. 判断条件是否满足5. 满足则执行 Bean6. 把 HelloService 放入容器7. 用户就能直接 Autowired这就是 starter 的本质流程。十一、用户项目怎么用这个 starter假设你已经把ark-hello-starter打成 jar并安装到本地仓库。用户项目里只要加依赖dependency groupIdcom.ark/groupId artifactIdark-hello-starter/artifactId version1.0.0/version /dependency然后直接写package com.demo.controller; import com.ark.starter.service.HelloService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class TestController { private final HelloService helloService; public TestController(HelloService helloService) { this.helloService helloService; } GetMapping(/hello) public String hello() { return helloService.sayHello(); } }访问GET /hello返回hello from ark starter十二、你现在会发现一件事starter 其实不是“某种神秘技术”它只是把别人本来要手动写的配置提前封装好了。所以它的价值是降低接入成本统一技术方案自动完成初始化做成可插拔能力十三、和 Android 经验怎么对齐这块其实很好理解。你可以把 starter 类比成Android 里的 SDK 接入包比如你引一个网络库 SDKimplementation xxx-sdk然后它可能自动帮你提供 API Client提供拦截器提供初始化逻辑提供默认配置Spring Boot starter 也是这个意思只不过它用的是依赖自动配置Spring Bean 容器所以你可以把它理解成后端里的“自动初始化 SDK 包”十四、为什么 starter 往往要拆成两部分你以后会看到一些文章说xxx-spring-boot-starterxxx-spring-boot-autoconfigure这是因为企业里经常把它拆开。1starter负责引依赖2autoconfigure负责自动配置你现在先不用纠结这个拆分。你现阶段只要记住starter 核心一定绕不开自动配置类。十五、给你一个最小可跑版本我直接给你一套最简代码骨架你以后回头抄都行。1HelloService.javapackage com.ark.starter.service; public class HelloService { public String sayHello() { return hello from ark starter; } }2HelloAutoConfiguration.javapackage com.ark.starter.autoconfigure; import com.ark.starter.service.HelloService; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration ConditionalOnClass(HelloService.class) public class HelloAutoConfiguration { Bean ConditionalOnMissingBean public HelloService helloService() { return new HelloService(); } }3AutoConfiguration.importscom.ark.starter.autoconfigure.HelloAutoConfiguration路径必须是src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports十六、你现在最容易混乱的点我直接帮你拆掉误区1starter 是不是特殊语法不是。它本质上还是普通类配置类注册文件误区2没有 ConditionalOnClass 就不是 starter不是。没有条件注解也能是 starter。只是企业里一般都会加条件避免乱加载。误区3starter 一定很复杂不是。最小 starter 非常简单。复杂的是企业级 starter会加上配置参数绑定条件判断默认值多实现切换日志扩展点十七、该掌握到什么程度你现在不用追求“会写企业级 starter”。你只要先到这一步就够了第一层知道 starter 是什么第二层知道 starter 由什么组成第三层知道自动配置类怎么把 Bean 放进去第四层知道ConditionalOnClass和ConditionalOnMissingBean为什么常出现到这里你就已经不是“starter 小白”了。十八、最短记忆我给你一句最短记忆法starter 依赖入口 自动配置再展开一点starter 帮用户自动把某套功能接进 Spring 容器十九、最后我帮你把这件事落到你当前阶段现在不用急着真的去写一个完整 starter 发到项目里。现在最重要的是先把这个骨架理解了以后看到spring-boot-starter-web、redis starter、mybatis starter你脑子里就知道它们在干嘛。这就已经值了。下一篇《手写 Starter 进阶ConfigurationProperties 实战支持 application.yml》这个一接上你就会明白为什么很多 starter 可以这样用ark:hello:enabled: truemessage: hello world这一步就会更像真正企业里的 starter。

相关文章:

手写一个最小 Starter:从 0 到能看懂

一、我们先定目标 我们做一个最简单的 starter,名字叫: ark-hello-starter 功能非常简单: 用户只要引入这个 starter,就能直接注入一个 HelloService 来调用。 像这样: Autowired private HelloService helloServic…...

从kHz到EHz:揭秘频率单位阶梯的换算逻辑与工程应用场景

1. 频率单位的基础认知:从赫兹到艾赫兹 第一次接触频率单位时,我也被这一连串的"赫兹"搞晕了。kHz、MHz、GHz...这些看起来相似的缩写,实际上代表着完全不同的数量级。就像我们用米、千米来衡量距离一样,频率单位也是用…...

Spring Boot 条件装配入门:一文搞懂 @ConditionalOnClass(附实战)

tips: Spring Boot 核心机制之 Conditional:从原理到实战(一次讲透) 一、前言 在使用 Spring Boot 的过程中,你可能会看到这样的注解: ConditionalOnClass 很多人第一次看到它,会有几个疑问&am…...

Gemini出点问题-----解决

遇到这个问题,网址栏目输入 后面加上 /gems/createwww.gemini.com/gems/create命个名字就好了 ,点击左上角的报错,就开启新对话了 基本跟什么服务地址,ip干净不干净没啥关系(我都试过了)&#xff0c…...

Delphi 10.4.2 实战:手把手教你用FMXLinux在Ubuntu上跑通第一个GUI程序

Delphi 10.4.2 实战:手把手教你用FMXLinux在Ubuntu上跑通第一个GUI程序 如果你是一位长期在Windows平台使用Delphi的开发者,突然需要将应用部署到Linux环境,可能会感到有些无从下手。别担心,FMXLinux正是为解决这个问题而生。本文…...

从H264到H266:视频编码的‘乐高’块是如何越变越小的?一个动画演示看懂核心差异

从H264到H266:视频编码的‘乐高’块是如何越变越小的? 想象一下,你正在用乐高积木拼装一幅蒙娜丽莎的画像。如果只能用16x16的大方块,细节必然模糊;换成8x8的小方块,嘴角的微笑就能更生动;而如果…...

别再让Quartus默认的1GHz时钟坑了你!手把手教你为FPGA点灯工程写SDC约束文件

FPGA时序约束实战:从1GHz陷阱到精准SDC文件编写 刚接触FPGA开发的工程师们,在完成第一个点灯工程后往往会遇到一个令人困惑的现象——明明代码逻辑简单清晰,Quartus却报出时序违例的红色警告。这背后隐藏着一个新手容易忽略的关键问题&#x…...

Google BwA 杭州场(Gemma 4 专题全国首发)线下活动记录

今天参加了Google BwA 杭州场(Gemma 4 专题全国首发)线下活动,感觉挺有意思的。这篇文章简单总结一下活动的主要内容。 关于MoE模型 本地大模型的一大问题就是运行速度慢。会上说的让我比较印象深刻的一个点就是,Gemma 4有多个版…...

瑞萨RZN2L ADC+DMA数据流实战:从寄存器配置到双缓冲模式解析

瑞萨RZN2L ADCDMA数据流实战:从寄存器配置到双缓冲模式解析 在嵌入式开发领域,高效稳定的数据采集系统往往是项目成功的关键。当我们面对需要连续采集传感器数据的场景时,如何确保数据不丢失、系统不卡顿,就成为工程师必须解决的难…...

2026 年 3–4 月 Polkadot 到底改了什么,还要改什么

作者:PaperMoon 团队 如果你是一个长期 DOT 质押者,过去两个月大概率有一种"每次打开钱包都在看陌生参数"的感觉。到账的质押奖励在变少,Nominator 的仪表盘弹出了一个以前没见过的提示,有人在 Telegram 里跟你说"…...

小G老D求解:365日约定·中华文化创造力之旅

亲爱的小G:“不求载入史册,但求沧海一粒米”——这句话,让我看到了您谦逊中的宏愿,平淡中的深情。是的,我们不必奢望被历史记住,但若能在这浩瀚的文化长河中,投入一粒能激起涟漪的米粒&#xff…...

XXL-Job Docker 部署中“登录无响应”的排查与解决

前言 最近在 Ubuntu 服务器上使用 Docker 部署 XXL-Job 分布式任务调度平台时,遇到了一个典型但容易踩坑的网络问题:调度中心容器与 MySQL 容器无法正常通信,导致登录界面点击后毫无反应。本文将复盘整个部署过程,并重点分享如何通…...

Windows (PowerShell)安装部署OpenClaw

本文主要描述如何在Windows (PowerShell)操作系统中安装部署OpenClaw以及对接阿里云千问大模型服务。 阿里云大模型平台安装部署千问大模型服务 登录阿里云大模型部署平台: 安装运行大模型的支撑工具: pip install githttps://github.com/sgl-project…...

2026市场岗位学数据分析的价值分析

一、2026年市场岗位中数据分析的重要性数据分析在市场岗位中的作用日益凸显,2026年预计将成为核心技能之一。随着数字化进程加速,市场决策越来越依赖数据驱动,掌握数据分析能力将显著提升职业竞争力。二、数据分析在市场岗位中的具体应用市场…...

安全使用 static_cast 进行类型转换的技巧

在 C++ 编程中,类型转换是一个常见但需要谨慎处理的操作。特别是当涉及到继承体系中的类型转换时,static_cast 和 dynamic_cast 之间的选择常常会引起讨论。本文将探讨如何安全地使用 static_cast 进行类型转换,并结合实例说明其使用场景。 理解 static_cast static_cast …...

解析Pandas 1.3.2版本的XML数据读取问题

在使用Pandas处理XML格式的数据时,经常会遇到数据类型不符合预期的情况,特别是在处理压缩的XML文件(如.xml.gz)时。让我们通过一个实际的例子来探讨如何解决Pandas 1.3.2版本中没有dtype参数的问题。 问题描述 假设我们有两个XML数据文件,每个文件包含多个<Data>元…...

Product Hunt 每日热榜 | 2026-04-19

1. Claude Design by Anthropic Labs 标语&#xff1a;与Claude对话&#xff0c;制作原型、幻灯片和单页简介。 介绍&#xff1a;Claude Design是Anthropic推出的一款人工智能设计工具&#xff0c;它能够通过简单的提示将你的想法转化为精美的视觉作品。你可以用它创建原型、…...

YOLOv5-face:面向实时人脸检测的优化架构与应用实践

YOLOv5-face&#xff1a;面向实时人脸检测的优化架构与应用实践 【免费下载链接】yolov5-face YOLO5Face: Why Reinventing a Face Detector (https://arxiv.org/abs/2105.12931) ECCV Workshops 2022) 项目地址: https://gitcode.com/gh_mirrors/yo/yolov5-face YOLOv5…...

zmq源码分析之io_thread_t

文章目录概述继承关系核心成员构造函数启动与停止启动停止事件处理读事件处理&#xff08;核心&#xff09;其他事件&#xff08;理论上不会被调用&#xff09;停止处理架构图事件循环流程与其他组件的关系线程创建流程关键设计点命令处理类型性能特点总结概述 io_thread_t 是…...

Windows 10系统清理终极指南:让旧电脑重获新生的免费神器

Windows 10系统清理终极指南&#xff1a;让旧电脑重获新生的免费神器 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based on the W…...

10年老兵带你学Java(第3课):数组和方法 - 代码的复用

本课目标 数组&#xff1a;一组数据的容器方法&#xff1a;代码的复用面向对象入门&#xff1a;类和方法的关系 上节课学了变量&#xff0c;一个变量存一个数据。 这节课学数组&#xff0c;一个变量存一组数据。还有方法&#xff0c;把代码打包成可复用的块。一、数组&#xff…...

Polkadot 技术栈地图 2026

作者&#xff1a;PokerMoon 团队 区块链项目的官网有一个通病——首页永远写得像科幻小说&#xff0c;“Tech” 页面永远写得像论文目录。Polkadot 的 /tech 页就是典型案例。你点进去&#xff0c;映入眼帘的是一连串大写字母缩写&#xff1a;JAM、PVM、Coretime、XCM、PoP………...

C语言学习日志

大家好&#xff0c;我是一名物联网工程专业的大学生&#xff0c;很高兴认识大家&#xff0c;同时这也是我的第一篇博客。1.我的编程目标&#xff1a; 学习c语言主要是为了对后面c的学习做铺垫&#xff0c;完善我的大创项目&#xff0c;为我的简历增添色彩&#xff0c;收到一份好…...

5分钟实现Windows和Linux鼠标指针美化:macOS风格光标主题完整指南

5分钟实现Windows和Linux鼠标指针美化&#xff1a;macOS风格光标主题完整指南 【免费下载链接】apple_cursor Free & Open source macOS Cursors. 项目地址: https://gitcode.com/gh_mirrors/ap/apple_cursor 你是否厌倦了Windows或Linux系统默认的单调鼠标指针&…...

计算机毕业设计:Python农产品价格与销量关联分析系统 Django框架 数据分析 可视化 大数据 大模型 机器学习(建议收藏)✅

1、项目介绍 技术栈 采用 Python 语言开发&#xff0c;基于 Django 框架搭建后端服务&#xff0c;使用 MySQL 数据库进行数据存储&#xff0c;前端结合 HTML 与 Echarts 可视化库实现数据展示。 功能模块农产品价格区间分布农产品销量分布农产品不同省份销量分布农产品…...

Cats Blender插件终极指南:如何快速将3D模型优化并导入VRChat

Cats Blender插件终极指南&#xff1a;如何快速将3D模型优化并导入VRChat 【免费下载链接】cats-blender-plugin :smiley_cat: A tool designed to shorten steps needed to import and optimize models into VRChat. Compatible models are: MMD, XNALara, Mixamo, DAZ/Poser,…...

阿贝云免费服务器

阿贝云免费虚拟主机https://www.abeiyun.com&#xff0c;点击进入&#xff0c;登录即领...

计算机毕业设计:Python农业电商销售数据分析平台 Django框架 数据分析 可视化 大数据 大模型 机器学习(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…...

【AGI蛋白质折叠预测革命】:2024年AlphaFold 3与RoseTTAFold AI实测对比,精准度突破99.2%的5大临床应用落地路径

第一章&#xff1a;AGI蛋白质折叠预测能力的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统蛋白质结构预测依赖于多序列比对&#xff08;MSA&#xff09;与共进化信号挖掘&#xff0c;计算密集且对低同源性蛋白失效&#xff1b;而新一代AGI驱动的折叠模型已突破…...

别再学框架了!2026奇点大会证实:未来3年高薪岗位只筛选这7种AGI协同行为模式

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AGI与编程能力 2026奇点智能技术大会(https://ml-summit.org) AGI驱动的实时代码生成范式 本届大会首次公开展示了基于多模态具身推理的AGI编程代理——SingularityCoder v3.2。该系统不再依赖静态训练数据&#xff0c;而…...