百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

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

  1. 在本地 Maven 仓库中安装你的 Starter 项目:mvn clean install。
  2. 在需要使用该 Starter 的 Spring Boot 项目中,添加依赖:

<dependency>

 <groupId>com.example</groupId>

 <artifactId>greeting-spring-boot-starter</artifactId>

 <version>1.0.0</version>

 </dependency>
  1. 在 application.properties 中进行配置:
greeting.name=Spring Boot 3 
greeting.message=Welcome
  1. 现在,你可以在你的应用中注入并使用 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语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规...

90%的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实例所需的所有元数据。...

一家拥有 158 年历史的公司遭遇索赔,被迫关闭!

...

Java 技术岗面试全景备战!从基础到架构的系统性通关攻略分享

Java技术岗的面试往往是一项多维度的能力检验。本文将会从核心知识点、项目经验到面试策略,为你梳理一份系统性的备战攻略!...

取消回复欢迎 发表评论: