Spring Boot 3.x 制作 Starter 快速上手体验,通过实践理解自动装配原理

news/2025/10/14 19:35:09/文章来源:https://www.cnblogs.com/tlnshuju/p/19141849

Spring Boot 3.x 制作 Starter 快速上手体验,通过实践理解自动装配原理

2025-10-14 19:27  tlnshuju  阅读(0)  评论(0)    收藏  举报

本篇文章讲述 Spring Boot 自动装配的概念和实战, 开发一个 starter, 穿插自动装配的知识点理解。

什么是自动装配?

传统 Spring 里,我们需要在 applicationContext.xml 或者配置类里,手动写一堆 <bean>@Bean,告诉 Spring 要创建哪些对象(Bean)。

Spring Boot 的目标是“约定大于配置”,让开发者尽量少写配置,所以它引入了 自动装配,

定义: 自动装配 = Spring Boot 根据当前 classpath 里的依赖、配置文件和条件判断,自动帮你注册合适的 Bean 到容器中。

你只要引了依赖,Spring Boot 就猜到你要用啥,并帮你准备好对应的 Bean。

接下来实战上手自动装配,再深入讲原理。

需求分析

开发一个 excel 文档导出,要求在查询接口上使用注解,便捷导出 excel 文档。

方案

我们开发一个starter , starter 用到了自动装配功能 , 而且 starter 已经做了相关的配置和需要的依赖,调用方引入我们的stater, 通过一个注解就能实现 excel 文档导出,符合需求中要的便捷性。

环境说明

  • spring boot 3.5.6
  • java 21
  • Spring web
  • lombok
  • 第三方依赖 Apache POI (操作 Excel)

pom 依赖:

注意打 jar 包的插件,不能打成可执行 jar,而是普通 jar 包,否则其它模块无法引用 jar 包。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.6</version><relativePath/> <!-- lookup parent from repository --></parent>
<groupId>com.demoexcel</groupId>
<artifactId>excel-stater</artifactId>
<version>1.0.0</version>
<name>ExcelExportAutoConfig</name>
<description>ExcelExportAutoConfig</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>21</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring Boot Web MVC --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.36</version><optional>true</optional></dependency><!-- Spring Boot AOP --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--Apache POI 来操作 Excel--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip> <!-- 不生成可执行 jar --></configuration></plugin></plugins></build></project>

SpringBoot 实现 excel 导出功能

我们先开发导出功能,再加入自动装配,然后可以生成一个starter 最终让别的项目引入,便可以从实践得出 spring boot 自动装配与 starter 的效果。

项目名称:my-excel-starter

初始化后端项目,依赖安装环境说明配置。

application.yml 配置文件啥也不用写,追求快速上手。

开发流程:

  1. 编写一个注解 @ExcelExport
  2. 编写一个 AOP 切面, 切面内先让切入点执行方式,得到方法的返回值,使用 Apache POI 操作 excel 导出。
  3. controller 开发一个 exportUser 接口(理解成一个list查询接口),接口内模拟两条查询到的假数据。使用 @ExcelExport 便能实现导出功能。

功能开发好了我们再加入自动装配。

  1. 注解开发
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelExport {
String filename() default "export.xlsx";
}
  1. 切面开发
/**
*  AOP , 导出Excel 文件
*/
@Aspect
@Component
public class ExcelExportAspect {
@SneakyThrows
@Around("@annotation(excelExport)")
public Object exportExcel(ProceedingJoinPoint pjp, ExcelExport excelExport) {
Object result = pjp.proceed();
if (result instanceof List<?> list && !list.isEmpty() && list.get(0) instanceof Map<?,?> row) {HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("Sheet1");// 表头Row header = sheet.createRow(0);int col = 0;for (Object key : row.keySet()) {header.createCell(col++).setCellValue(key.toString());}// 数据int rowNum = 1;for (Object obj : list) {Map<?, ?> map = (Map<?, ?>) obj;Row dataRow = sheet.createRow(rowNum++);int c = 0;for (Object value : map.values()) {dataRow.createCell(c++).setCellValue(value != null ? value.toString() : "");}}// 写入 HttpServletResponseresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(excelExport.filename(), "UTF-8"));workbook.write(response.getOutputStream());workbook.close();return null;}return result;}}
  1. controller 接口测试导出功能
@RestController
public class DemoController {
@ExcelExport(filename = "users.xlsx")
@GetMapping("/export")
public List<Map<String, Object>> exportUsers() {List<Map<String, Object>> list = new ArrayList<>();list.add(Map.of("id", 1, "name", "Alice", "age", 20));list.add(Map.of("id", 2, "name", "Bob", "age", 25));return list;}}

测试,访问 localhost:8080\export 自动下载 excel 文件。

功能开发完成,我们把这个项目当成一个工具,提供给别的项目使用,为了便于其它项目使用,实现自动装配

自动装配

工作原理

名词解释:

@Bean (标记方法): 声明一个工厂方法,返回值对象会注册到 Spring 容器,成为一个 Bean。

@Configuration : 声明这是一个配置类,里面的 @Bean 方法会被 Spring 识别,用来定义 Bean。

@Component : 如果与 @Bean 搭配 , Spring 不会用代理,每次调用Bean的方法都是 new 一个新的对象。

如何实现自动装配?

Spring Boot 的自动装配流程大概是这样:

当你启动一个 Spring Boot 应用时(@SpringBootApplication)。

  1. @SpringBootApplication 注解内部有**@EnableAutoConfiguration**
  2. 加载自动配置类
  1. 注册配置类
  1. 条件判断(筛选)
  1. 注册 Bean 定义
  1. 容器刷新(refresh) → 实例化 Bean

可以看出自动配置很灵活,按条件注册Bean 。

注意:spring 3.x 使用 META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports 作为自动装配的配置文件,区别于 spring 2.x 使用的 META-INF/spring.factories

以上可知,想要实现自动装配核心要编写:

开发实现
  1. 编写自动配置类 ExcelExportAutoConfiguration , 打上条件注解@ConditionalOnMissingBean(ExcelExportAspect.class) , 如果不存在ExcelExportAspect.class 才会加载这个配置类。
@Configuration
@ConditionalOnMissingBean(ExcelExportAspect.class)
public class ExcelExportAutoConfiguration {
@Bean
public ExcelEx
portAspect excelExportAspect() {
return new ExcelExportAspect();
}
}
  1. AutoConfiguration.imports 放入你想要自动装配的配置类
com.demoexcel.excelstater.config.ExcelExportAutoConfiguration

目录结构如下

生成 stater

经过以上步骤,已经开发好了一个 stater, 接下来仅需 maven install 打出一个 jar 包,在其它项目使用测试效果。

双击以后,本地maven仓库会有一个依赖包,可在其它项目中引入,依赖包的坐标是本项目的坐标:

确认本地maven仓库有这个依赖:C:\Users\Administrator.m2\repository\com\demoexcel

引入 starter

刚刚生成了一个 starter 我们自己测试看效果。

  1. 创建一个Spring boot项目,项目名称: example-excel,基本 web 依赖。

  2. 引入 starter,新项目直接使用注解,立刻享受开箱即用,什么配置都不用改。

  3. 写一个controller , 打上注解 @ExcelExport(filename = “users.xlsx”)

@RestController
public class DemoController {
@ExcelExport(filename = "users.xlsx")
@GetMapping("/export")
public List<Map<String, Object>> exportUsers() {List<Map<String, Object>> list = new ArrayList<>();list.add(Map.of("id", 1, "name", "Alice"));list.add(Map.of("id", 2, "name", "Bob"));return list;}}

启动新项目,访问接口,下载 excel 功能可用。

理解自动装配作用

为了帮助理解自动装配的作用,最后作出一点说明,如果在 stater项目中没有编写 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 配置,那么新项目引入starter 依赖包需要在启动类添加包扫描的配置,因为spring 默认仅扫描启动类同级目录的包。自动装配中还写了一个配置类,能够确保Bean的实例化。

自动装配的价值在于实现了stater 的开箱即用,引入依赖不用实例化 bean 、包扫描等配置。

自动装配的本质

Spring Boot 自动装配就是通过条件化配置,把需要的 Bean 定义提前写好,然后在应用启动时根据运行环境(类路径、配置文件、已有 Bean)去“有选择地注册这些 Bean”。

自动装配Bean 和普通Bean注册相似,不过是多了一个条件化配置,减少了配置冲突。

关键组件

  • Configuration Class Parser(配置类解析器)

  • 负责解析@Configuration@Bean,由 ConfigurationClassPostProcessor 驱动。

  • AutoConfiguration Import Selector(选择器)

  • 负责把**所有候选的自动配置类(spring.factories,AutoConfiguration.imports)**导入。

  • ConditionEvaluator(条件评估器)

  • 评估 @ConditionalXXX 注解,决定配置类是否生效。

  • BeanDefinitionRegistry(Bean 定义注册器)

  • 真正向容器注册 Bean 定义。

  • 负责根据 BeanDefinition 实例化对象

  • ApplicationContext(上下文容器)

  • Bean 创建、依赖注入、生命周期管理都发生在这里。

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

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

相关文章

动火作业风险早预警!AI + 热成像技术筑牢防火安全线

动火作业(焊接、切割、喷灯使用等)的安全管理,长期受限于技术瓶颈与监管盲区:人工巡检难实时判断动火点周边是否存在易燃物,更无法精准测量易燃物与动火点的安全距离;AI 视觉技术因无法识别物体材质,难以界定 “…

DBA | MySQL 数据库基础用户和信息权限管理实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解题报告-P5664 [CSP-S2019] Emiya 家今天的饭

P5664 [CSP-S2019] Emiya 家今天的饭 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 \(n\) 种烹饪方法,且会使用 \(m\) 种主要食材做菜。为了方便叙述,我们对烹饪方法从 \(1 \sim n\) 编号,对主要食材从 \(1 \sim…

5G x 工业应用:探索德承工控机在5G工业应用中所扮演的关键角色 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年生态格宾网厂家推荐榜:格宾网石笼/格宾网护坡/格宾网挡墙/格宾网网箱厂家推荐,聚焦工程安全与生态保护,助力基建项目高效落地

随着国家基础设施建设持续推进、生态环保理念深度融入工程设计,以及基建项目对材料耐用性、适配性要求的不断提升,生态格宾网系统已从传统水利工程逐步拓展至公路边坡防护、市政河道治理、矿山生态修复等多个领域,2…

时序博弈算法荣获时间检验奖

某中心学者Rupak Majumdar因其2003年发表的时序博弈论文获得CONCUR时间检验奖。该研究提出了包含时间约束的并发双人博弈模型及其分析算法,现已成为信息物理系统形式化分析的标准方法。获奖成就 某中心学者Rupak Maju…

STM32主控芯片硬件设计总结

STM32主控芯片硬件设计总结 我记的有点过于多了。。。 因为想多学一点所以弄了这么多字的笔记,重要的会加粗标注的。晶振电路设计通常情况下,STM32芯片的原理图会使用两个晶振,而在进行晶振贴片时,由于晶振的体积比…

DeepSeek、LangGraph和Python融合LSTM、RF、XGBoost、LR多模型预测NFLX股票涨跌|附完整代码数据

全文链接:https://tecdat.cn/?p=44060原文出处:拓端数据部落公众号分析师:He Bai开篇:先解决你的股票预测痛点! 做股票分析总卡壳?传统方法抓不住股价的波动规律?模型跑出来准确率低,还不知道问题出在哪?别慌…

【论文复现上新】AAAI2025!北理工团队提出FBRT-YOLO:面向实时航拍图像更快更好的目标检测 |计算机视觉|目标检测

北理工团队在AAAI 2025的论文中提出了一种专为实时航拍图像检测而深度优化的新架构FBRT-YOLO。阅读原文,欢迎访问Lab4AI.cn官网~01 论文概述 论文名称: FBRT-YOLO: Faster and Better for Real-Time Aerial Image De…

亚马逊因暗黑模式订阅设计支付25亿美元和解金

亚马逊因在Prime订阅服务中使用欺骗性的"暗黑模式"设计被FTC起诉,最终支付25亿美元和解金。这些界面设计故意误导用户注册并设置复杂的取消流程,违反了《恢复在线购物者信心法案》。亚马逊支付25亿美元和解…

P6645 [CCO 2020] Interval Collection

考虑一个结论是,最多选择两个区间。 维护一个线段树,每个结点维护左端点右端点和答案,就像维护模拟费用流那样,合并的时候天然保证了相交部分最少。

2025年排烟风机厂家推荐榜:混流风机|管道风机|排烟风机|离心风机|轴流风机|轴流风机厂家,专注高效消防与节能,助力多行业绿色升级

随着建筑安全标准提升、工业节能需求加剧及多行业绿色转型加速,通风空调设备已从传统建筑场景延伸至新能源、电子半导体、医药净化等高端领域。2025年市场规模预计进一步增长,但企业在选购时仍面临产品合规性、行业适…

h5完成一个吸附在键盘上的工具栏

h5完成一个吸附在键盘上的工具栏2025-10-14 19:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

【通达信L2黑科技】 用 DLL 把 10 年机构大单净额 1 秒拖进本地,选股、排序、回测快到飞起!

【通达信L2黑科技】 用 DLL 把 10 年机构大单净额 1 秒拖进本地,选股、排序、回测快到飞起!引言 通达信L2数据中,有一个L2_AMO资金流向函数:类型:资金流向函数 功能:成交额分档 描述:单数分档,按:N(0--3):超…

详细介绍:iCloud照片共享:在家庭内外分享iCloud照片

详细介绍:iCloud照片共享:在家庭内外分享iCloud照片pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

Flink 有状态流处理State、Keyed State、Checkpoint、对齐/不对齐与生产实践 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

对static新的认识

学习java时,我首先声明了一个统一响应结果的实体类: public Result success(Object object){Result result = new Result();result.code=1;result.msg="success";result.data=object;return result;}然后调…

C++STL之stack,queue与容器适配器 - 教程

C++STL之stack,queue与容器适配器 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025年氧化镁厂家最新推荐排行榜,电工级/高温/低温/中温/防火电缆/矿物绝缘/熔盐加热器/电热管用/单头管用/合成云母用氧化镁公司推荐!

随着工业技术的不断进步,氧化镁在各个领域的应用越来越广泛。从电工级氧化镁到高温、低温、中温氧化镁,再到防火电缆氧化镁、矿物绝缘氧化镁、熔盐加热器氧化镁、电热管用氧化镁、单头管用氧化镁以及合成云母用氧化镁…