Spring Boot 3.x 如何自定义 Starter

Spring Boot 3.x 自定义 Starter 的完整实现指南,快速构建一个兼容 Spring Boot 3.x 的 Starter 模块。


🧠 一、Spring Boot 3.x Starter 核心机制

✅ 1. Starter 的结构

一个典型的 Starter 模块包含以下部分:

部分说明
AutoConfiguration定义自动配置逻辑(如 @Bean 方法)
ConfigurationProperties提供外部化配置支持(如 application.properties
依赖管理pom.xmlbuild.gradle 中声明依赖
Starter 模块提供对外暴露的接口或工具类
AutoConfiguration.imports替代 spring.factories,用于注册自动配置类

📦 二、创建自定义 Starter 的完整步骤

✅ 步骤 1:创建 Maven 项目结构

my-spring-boot-starter/
├── my-spring-boot-starter-autoconfigure
│   └── src/
│       └── main/
│           ├── java/
│           └── resources/
│               └── META-INF/
│                   └── spring/
│                       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
└── my-spring-boot-starter
    └── src/
        └── main/
            └── java/
  • my-spring-boot-starter-autoconfigure:包含自动配置逻辑
  • my-spring-boot-starter:提供对外 API 接口或工具类

✅ 步骤 2:添加 Spring Boot 3.x 依赖(pom.xml

my-spring-boot-starter-autoconfigure/pom.xml
<dependencies>
    <!-- Spring Boot 3.x 起始依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>

    <!-- Jakarta EE 9+ 支持 -->
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.0.0</version>
    </dependency>

    <!-- 配置属性支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
my-spring-boot-starter/pom.xml
<dependencies>
    <!-- 引入自动配置模块 -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>my-spring-boot-starter-autoconfigure</artifactId>
        <version>1.0.0</version>
    </dependency>

    <!-- 其他公共依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

🧱 三、实现自动配置模块(AutoConfigure)

✅ 1. 创建自动配置类

package com.example.autoconfigure;

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(MyService.class) // 仅当类路径存在 MyService 时生效
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService();
    }
}

✅ 2. 创建服务类

package com.example.autoconfigure;

public class MyService {
    public void doSomething() {
        System.out.println("MyService is working!");
    }
}

✅ 3. 配置属性类(可选)

package com.example.autoconfigure;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {
    private String name = "default";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

✅ 4. 注册自动配置类(AutoConfiguration.imports

resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中添加自动配置类:

com.example.autoconfigure.MyAutoConfiguration

🔄 四、实现 Starter 模块

✅ 1. 提供对外 API 或工具类

package com.example.starter;

import org.springframework.stereotype.Component;

@Component
public class MyServiceClient {
    private final MyService myService;

    public MyServiceClient(MyService myService) {
        this.myService = myService;
    }

    public void execute() {
        myService.doSomething();
    }
}

✅ 2. 提供配置属性类(可选)

package com.example.starter;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyStarterConfig {
}

🧪 五、测试自定义 Starter

✅ 1. 在另一个 Spring Boot 项目中引入 Starter

<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

✅ 2. 使用 Starter 中的 Bean

@Service
public class ApplicationService {
    private final MyServiceClient client;

    public ApplicationService(MyServiceClient client) {
        this.client = client;
    }

    public void run() {
        client.execute();
    }
}

✅ 3. 配置属性(application.properties)

my.service.name=customName

🧩 六、Spring Boot 3.x Starter 的关键改进

改进点说明
自动配置文件使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 替代 spring.factories
包名迁移使用 jakarta.* 替代 javax.*
AOT 支持可通过 @ImportRuntimeHints 提供 AOT 编译支持
模块化支持支持 Java 9+ 的 JPMS 模块系统
性能优化自动配置加载更高效,减少启动时间

📦 七、发布 Starter 到 Maven Central

✅ 1. 配置 pom.xml 发布插件

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals><goal>jar</goal></goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

✅ 2. 执行发布命令

mvn clean deploy

🧱 八、完整 Starter 模块结构示例

my-spring-boot-starter-autoconfigure

src/
└── main/
    ├── java/
    │   └── com.example.autoconfigure/
    │       ├── MyAutoConfiguration.java
    │       ├── MyService.java
    │       └── MyServiceProperties.java
    └── resources/
        └── META-INF/
            └── spring/
                └── org.springframework.boot.autoconfigure.AutoConfiguration.imports

my-spring-boot-starter

src/
└── main/
    └── java/
        └── com.example.starter/
            ├── MyServiceClient.java
            └── MyStarterConfig.java

❗ 九、常见问题与解决方案

问题原因解决方案
自动配置未生效未正确注册 AutoConfiguration.imports确保配置类路径正确
包名错误(如 javax未替换为 jakarta使用 IDE 全局替换 javax.*jakarta.*
AOT 编译失败未提供 RuntimeHints添加 @ImportRuntimeHints 并实现 RuntimeHintsRegistrar
启动失败依赖版本不兼容使用 spring-boot-dependencies 统一管理版本
模块化编译失败未正确配置 module-info.java添加 requires spring.boot.autoconfigure; 等模块声明

✅ 十、Spring Boot 3.x Starter 关键类与接口

类/接口作用
AutoConfiguration.imports注册自动配置类
@ConditionalOnClass条件化自动装配
@ConditionalOnMissingBean避免重复注册 Bean
@ImportRuntimeHints提供 AOT 编译支持
RuntimeHintsRegistrar注册运行时依赖(如反射、资源)
@ConfigurationProperties绑定外部配置
@EnableConfigurationProperties启用配置属性绑定

🧩 十一、Spring Boot 3.x Starter 的高级功能(可选)

✅ 1. AOT 支持(Ahead-of-Time Compilation)

@ImportRuntimeHints(MyRuntimeHints.class)
@Configuration
public class MyAutoConfiguration {
    // ...
}

public class MyRuntimeHints implements RuntimeHintsRegistrar {
    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        hints.reflection().registerType(MyService.class);
    }
}

✅ 2. 模块化支持(Java 9+)

module com.example.starter {
    requires spring.boot.autoconfigure;
    exports com.example.starter;
}

✅ 3. GraalVM Native Image 支持

# 使用 Spring Boot 3.x 的 Native Image 插件
./mvnw install -Pnative

📦 十二、Starter 项目依赖管理建议

依赖推荐版本
Spring Boot 3.x3.0.0
Spring Framework 66.0.0
Jakarta EE 9+9.0.0
Hibernate ORM 6.x6.1.0
Micrometer 2.x2.0.0
Spring Security 6.x6.0.0

🧪 十三、完整示例:my-spring-boot-starter-autoconfigure

MyAutoConfiguration.java

package com.example.autoconfigure;

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(MyService.class)
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService();
    }
}

MyService.java

package com.example.autoconfigure;

public class MyService {
    public void doSomething() {
        System.out.println("MyService is working!");
    }
}

MyServiceProperties.java

package com.example.autoconfigure;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {
    private String name = "default";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

AutoConfiguration.imports

com.example.autoconfigure.MyAutoConfiguration

✅ 十四、总结

特性Spring Boot 3.x Starter 实现
自动配置机制使用 AutoConfiguration.imports 替代 spring.factories
包名迁移javax 迁移到 jakarta
条件装配使用 @ConditionalOnClass, @ConditionalOnMissingBean
配置属性使用 @ConfigurationProperties@EnableConfigurationProperties
AOT 支持使用 @ImportRuntimeHintsRuntimeHintsRegistrar
模块化支持使用 module-info.java 支持 JPMS
GraalVM 支持支持 Native Image 编译
依赖管理使用 Spring Boot 3.x 的依赖版本(如 Spring Framework 6.x)
性能优化启动速度提升 20%~30%,内存占用降低 10%~20%

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值