Spring Boot 3.x 自定义 Starter 详解
ztj100 2025-08-02 22:49 4 浏览 0 评论
今天星期六,继续卷spring boot 3.x。
在 Spring Boot 3.x 中,自定义 Starter 是封装和共享通用功能、实现“约定优于配置”理念的强大机制。通过创建自己的 Starter,您可以将特定的依赖、自动配置和默认设置打包,从而简化多个项目的集成和开发过程。本文将详细介绍在 Spring Boot 3.x 中创建自定义 Starter 的完整流程,并重点阐述其与旧版本的区别及最佳实践。
核心概念:Starter 的作用
Spring Boot Starter 主要包含以下两个核心部分:
- 依赖管理:一个 xxx-spring-boot-starter 的 pom.xml 文件,它传递性地引入了所需的所有依赖。
- 自动配置:一个 xxx-spring-boot-autoconfigure 模块,其中包含了自动配置类,这些类会在特定条件下(例如,类路径上存在某个类)自动注册 Spring Beans。
从 Spring Boot 2.x 到 3.x 的关键变化
Spring Boot 3.x 带来了几个重要的变化,对自定义 Starter 的创建产生了直接影响:
- Java 17 基线:Spring Boot 3.0 要求至少使用 Java 17。
- 迁移到 Jakarta EE:所有依赖项已从 Java EE 迁移到 Jakarta EE,这意味着包名从 javax.* 变为 jakarta.*。[1]
- 自动配置注册方式变更:这是最核心的变化。在 Spring Boot 2.7 之前,自动配置类需要在 META-INF/spring.factories 文件中通过 org.springframework.boot.autoconfigure.EnableAutoConfiguration键来注册。从 Spring Boot 2.7 开始,引入了一种新的方式,并最终在 Spring Boot 3.x 中成为唯一支持的方式:在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中列出自动配置类的全限定名。[2]
创建自定义 Starter 的步骤
创建一个功能完备的自定义 Starter 通常遵循以下步骤。我们将以一个简单的“问候服务”为例,该服务可以根据配置输出不同的问候语。
1. 项目结构规划
最佳实践建议将 Starter 分为两个模块:
- greeting-spring-boot-autoconfigure:包含核心的自动配置逻辑。
- greeting-spring-boot-starter:一个“空”的 Starter,主要用于管理依赖,它会引入 autoconfigure 模块和其他必要的库。[3]
这种分离的好处在于,autoconfigure 模块可以被更灵活地包含在其他项目中,而不仅仅是通过 Starter。
2. 创建autoconfigure模块
a. 添加核心依赖
在
greeting-spring-boot-autoconfigure 模块的 pom.xml 中,引入 spring-boot-starter 和 spring-boot-autoconfigure:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- 其他业务逻辑需要的依赖 -->
</dependencies>
b. 创建配置属性类 (Properties)
创建一个类来接收来自 application.properties 或 application.yml 的自定义配置。
package com.example.greeting.autoconfigure;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "greeting")
public class GreetingProperties {
private String name = "World";
private String message = "Hello";
// Getters and Setters
}
c. 实现业务逻辑服务
创建一个简单的服务类,它将使用上述配置属性。
package com.example.greeting.autoconfigure;
public class GreetingService {
private final GreetingProperties properties;
public GreetingService(GreetingProperties properties) {
this.properties = properties;
}
public String greet() {
return properties.getMessage() + ", " + properties.getName() + "!";
}
}
d. 创建自动配置类 (AutoConfiguration)
这是 Starter 的核心,它会根据条件创建并注册 GreetingService Bean。
package com.example.greeting.autoconfigure;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(GreetingProperties.class)
@ConditionalOnProperty(prefix = "greeting", name = "enabled", havingValue = "true", matchIfMissing = true)
public class GreetingAutoConfiguration {
private final GreetingProperties properties;
public GreetingAutoConfiguration(GreetingProperties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean
public GreetingService greetingService() {
return new GreetingService(properties);
}
}
- @Configuration: 声明这是一个配置类。
- @EnableConfigurationProperties: 启用 GreetingProperties 类与配置文件的绑定。
- @ConditionalOnProperty: 允许通过配置来启用或禁用此自动配置。
- @Bean 和 @ConditionalOnMissingBean: 只有当应用上下文中不存在 GreetingService 类型的 Bean 时,才会创建这个默认的 Bean,这允许用户自定义覆盖。
e. 注册自动配置类
在
src/main/resources/META-INF/spring/ 目录下创建一个名为
org.springframework.boot.autoconfigure.AutoConfiguration.imports 的文件。文件内容是自动配置类的全限定名:
com.example.greeting.autoconfigure.GreetingAutoConfiguration
3. 创建starter模块
a. 添加依赖
在
greeting-spring-boot-starter 模块的 pom.xml 中,添加对 autoconfigure 模块的依赖:
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>greeting-spring-boot-autoconfigure</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
这个 Starter 的主要职责就是提供一个简单的依赖入口,将所有需要的模块聚合起来。
4. 安装和使用自定义 Starter
- 在本地 Maven 仓库中安装你的 Starter 项目:mvn clean install。
- 在需要使用该 Starter 的 Spring Boot 项目中,添加依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>greeting-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
- 在 application.properties 中进行配置:
greeting.name=Spring Boot 3
greeting.message=Welcome
- 现在,你可以在你的应用中注入并使用 GreetingService 了:
@RestController
public class MyControlle
{
private final GreetingService greetingService;
public MyController(GreetingService greetingService)
{
this.greetingService = greetingService;
}
@GetMapping("/greet")
public String greet()
{
return greetingService.greet(); // 输出 "Welcome, Spring Boot 3!" }
}
最佳实践
- 命名规范:官方 Starter 的命名格式为 spring-boot-starter-xxx。自定义 Starter 推荐使用 xxx-spring-boot-starter 的格式,以区分官方和第三方 Starter。
- 条件化配置:充分利用 @Conditional 注解(如 @ConditionalOnClass、@ConditionalOnProperty、@ConditionalOnMissingBean 等),使你的自动配置更加灵活和健壮。
- 配置元数据:为了在 IDE 中提供良好的代码提示和自动完成,可以添加 spring-boot-configuration-processor 依赖。它会自动生成 META-INF/spring-configuration-metadata.json 文件。
- AOT 和 GraalVM 支持:Spring Boot 3 引入了对 AOT(Ahead-Of-Time)编译和 GraalVM 原生镜像的增强支持。如果你的 Starter 需要支持原生镜像,可能需要提供额外的运行时提示(Runtime Hints)。
相关推荐
- Java的SPI机制详解
-
作者:京东物流杨苇苇1.SPI简介SPI(ServiceProvicerInterface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规...
- 一文读懂 Spring Boot 启动原理,开发效率飙升!
-
在当今的Java开发领域,SpringBoot无疑是最热门的框架之一。它以其“约定大于配置”的理念,让开发者能够快速搭建和启动应用,极大地提高了开发效率。但是,你是否真正了解Spring...
- ServiceLoader
-
ServiceLoader是Java提供的一种服务发现机制(ServiceProviderInterface,SPI)...
- 深入探索 Spring Boot3 中的自定义扩展操作
-
在当今互联网软件开发领域,SpringBoot无疑是最受欢迎的框架之一。随着其版本迭代至SpringBoot3,它为开发者们带来了更多强大的功能和特性,其中自定义扩展操作更是为我们在项目开发中...
- Spring Boot启动过程全面解析:从入门到精通
-
一、SpringBoot概述SpringBoot是一个基于Spring框架的快速开发脚手架,它通过"约定优于配置"的原则简化了Spring应用的初始搭建和开发过程。...
- Spring Boot 3.x 自定义 Starter 详解
-
今天星期六,继续卷springboot3.x。在SpringBoot3.x中,自定义Starter是封装和共享通用功能、实现“约定优于配置”理念的强大机制。通过创建自己的Starte...
- Spring Boot 的 3 种动态 Bean 注入技巧
-
在SpringBoot开发中,动态注入Bean是一种强大的技术,它允许我们根据特定条件或运行时环境灵活地创建和管理Bean。相比于传统的静态Bean定义,动态注入提供了更高的灵活性和可...
- 大佬用4000字带你彻底理解SpringBoot的运行原理!
-
SpringBoot的运行原理从前面创建的SpringBoot应用示例中可以看到,启动一个SpringBoot工程都是从SpringApplication.run()方法开始的。这个方法具体完成...
- Springboot是如何实现自动配置的
-
SpringBoot的自动配置功能极大地简化了基于Spring的应用程序的配置过程。它能够根据类路径中的依赖和配置文件中的属性,自动配置应用程序。下面是SpringBoot实现自动配置的...
- Spring Boot3.x 应用的生命周期深度解析
-
SpringBoot应用的生命周期可以清晰地划分为三个主要阶段:启动阶段(Startup)...
- Springboot 启动流程及各类事件生命周期那点事
-
前言本文通过Springboot启动方法分析SpringApplication逻辑。从静态run方法执行到各个阶段发布不同事件完成整个应用启动。...
- Spring框架基础知识-常用的接口1
-
BeanDefinition基本概念BeanDefinition是Spring框架中描述bean配置信息的核心接口,它包含了创建bean实例所需的所有元数据。...
- Java 技术岗面试全景备战!从基础到架构的系统性通关攻略分享
-
Java技术岗的面试往往是一项多维度的能力检验。本文将会从核心知识点、项目经验到面试策略,为你梳理一份系统性的备战攻略!...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)