创建自定义 Spring Boot Starter:一个实践指南

源码地址: springboot-example (custom-spring-boot-starter分支)

Spring Boot 提供了一种极其便捷的方式来开发 Spring 应用,通过起步依赖(starters)简化了项目配置。然而,当你需要封装特定功能或配置以便在多个项目中重用时,创建自定义 Starter 可以大大提高效率。本文将指导你如何创建一个简单的自定义 Spring Boot Starter,以及如何在其他项目中使用它。

1. 创建 Starter 项目

首先,使用你喜欢的 IDE(如 IntelliJ IDEA)创建一个名为 demo-springboot-starter 的 Maven 项目。在 pom.xml 文件中添加 Spring Boot 的依赖和其他必需的依赖:

xml 复制代码
<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 http://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>2.7.18</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.liboshuai.pulsar</groupId>
    <artifactId>demo-springboot-starter</artifactId>
    <version>1.0</version>

    <packaging>jar</packaging>

    <name>demo-springboot-starter</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

2. 定义功能模块

在你的 Starter 中定义功能模块,例如,我们创建了 DemoModule 类来封装特定的业务逻辑:

java 复制代码
package com.liboshuai.pulsar;

/**
 * 1 - 创建一个Demo Project,模拟一个需要被封装的DemoModule模块,其中核心方法为exeModuleMethod
 * 2 - 通过starter封装可以直接初始化DemoModule的实例到Spring容器
 * 3 - 在Maven中引入starter,且在yml中配置相应到参数即可直接初始化DemoModule的实例
 * 4 - 在应用中注入DemoModule即可使用其exeModuleMethod方法
 */
public class DemoModule {

    private String version;

    private String name;

    public String exeModuleMethod() {
        return "Demo module, name = " + name + ", version = " + version;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

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

3. 配置属性类

利用 @ConfigurationProperties 注解来定义配置属性,使得这些属性可以在 application.ymlapplication.properties 文件中配置:

java 复制代码
package com.liboshuai.pulsar;

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

@ConfigurationProperties(prefix = "com.liboshuai.pulsar")
public class DemoProperties {
    private String version;
    private String name;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

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

4. 自动配置类

创建自动配置类 DemoAutoConfiguration,在这里根据配置属性初始化你的功能模块,并通过 @Bean 注解将其注册到 Spring 应用上下文中:

java 复制代码
package com.liboshuai.pulsar;

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

@Configuration
@EnableConfigurationProperties(DemoProperties.class)
public class DemoAutoConfiguration {

    @Bean
    public DemoModule demoModule(DemoProperties properties){
        DemoModule demoModule = new DemoModule();
        demoModule.setName(properties.getName());
        demoModule.setVersion(properties.getVersion());
        return demoModule;

    }
}

5. 启用自动配置

resources/META-INF 目录下创建 spring.factories 文件,并指定自动配置类:

ini 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.liboshuai.pulsar.DemoAutoConfiguration

对于 Spring Boot 2.7 及以上版本,也可以在 resources/META-INF.spring 目录下创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,内容如下:

复制代码
com.liboshuai.pulsar.DemoAutoConfiguration

完成这些步骤后,在 Maven 中执行 clean install,将你的 Starter 安装到本地仓库;或者clean deploy部署到远程maven仓库。

6. 使用自定义 Starter

创建另外一个 Spring Boot 应用 use-demo-springboot-starter 中,并通过添加对自定义 Starter 的依赖来使用它:

xml 复制代码
<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 http://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>2.7.18</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>org.example</groupId>
  <artifactId>use-demo-springboot-starter</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>use-demo-springboot-starter</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!--引入自定义starter-->
    <dependency>
      <groupId>com.liboshuai.pulsar</groupId>
      <artifactId>demo-springboot-starter</artifactId>
      <version>1.0</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </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>
      </plugin>
    </plugins>
  </build>
</project>

application.yml 中配置你的 Starter:

yaml 复制代码
com:
  liboshuai:
    pulsar:
      name: liboshuai
      version: 1.0

最后,创建一个 REST 控制器来展示 Starter 的功能:

java 复制代码
package org.example.pulsar;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UseDemoApplication {
    @Autowired
    private DemoModule demoModule;

    @GetMapping("/demo")
    public String demo() {
        return demoModule.exeModuleMethod();
    }
}

启动应用并访问 http://localhost:8080/demo,你将看到输出:"Demo module, name = liboshuai, version = 1.0"。

总结

通过创建自定义 Spring Boot Starter,你可以封装共用配置和功能模块,使得在不同的 Spring Boot 应用中重用变得简单快捷。遵循上述步骤,你可以创建属于自己的 Starter,提高开发效率,实现代码的高度复用。

相关推荐
wno70411 小时前
Spring Boot配合Hibernate Validator参数校验
spring boot·后端·hibernate
astronautyi12 小时前
Go 运行时内存分配与 GC 位图深度剖析
开发语言·后端·golang
techdashen12 小时前
Go 中如何处理错误
开发语言·后端·golang
GoGeekBaird12 小时前
Agent 时代,你的生产环境,真的敢让它裸奔吗
后端·agent
IT_陈寒12 小时前
Redis Pipeline用错竟比不用还慢,这个坑我帮你踩过了
前端·人工智能·后端
名字还没想好☜13 小时前
Go 1.21 context.WithoutCancel 实战:父 context 取消了,收尾任务还要继续跑
开发语言·后端·golang·go
源代码•宸13 小时前
前置准备:定时微服务有什么价值
经验分享·后端·微服务·云原生·架构
catino13 小时前
高并发详解
后端
掘金者阿豪13 小时前
GPT-6 Astra 来了,GPT-5.6 Sol 还值得用吗?聊聊 Coding、百万上下文、价格和 Plus/Pro
前端·后端
SamDeepThinking13 小时前
HashMap 分组操作的演进:从三次查找到一次调用
java·后端·程序员