likes
comments
collection
share

别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter

作者站长头像
站长
· 阅读数 22

之前写了很多的Starter,例如:

还写了如何发布项目到maven的中央仓库供别人引用:

如何发布jar包到maven中央仓库(2024年3月最新版保姆级教程)

但是我们应该如何写一个自己的springboot的Starter呢,今天我们来快速手撸一个spring-boot-starter出来

第一步,了解你要干什么

首先知道你想开发一个什么样的Starter出来,自定义工具类框架还是一个封装工具类框架的Starter,例如上面的阿里云和minio都是后者,其实是相对简单的一个Starter写法,如果是前者simple-cache就涉及到的东西比较复杂,这个如果后面大家有兴趣再教大家如何去写。

第二步,新建一个git仓库

如果你要写一个开源的,例如需要发布到maven中央仓库,你则需要在公开的git库上面新建,例如gitee,github。如果是私有的则初始化一个git仓库即可。

第三步,新建一个maven项目

这次博主用一个ffmpeg的Starter做一个演示,这个Starter就是封装工具类框架的Starter,在git仓库中新建一个maven模块:

别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter

第四步,定义你的Starter的结构

在java根目录下创建你的软件包

别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter

添加spring-boot-autoconfigure 包

之后在pom文件中引入下面的配置,使得你的Starter能起作用,并且能够达人

    <dependencies>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.4</version>
        </dependency>
    </dependencies>

创建Properties类

这里就叫FFmpegProperties,里面存ffmpeg的path,就是相关的配置,就像数据库的url 用户密码啥的。

package com.masiyi.ffmpeg.config;


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

@ConfigurationProperties(
        prefix = "ffmpeg"
)
public class FFmpegProperties {
    private String ffmpegPath;

    public String getFfmpegPath() {
        return ffmpegPath;
    }

    public void setFfmpegPath(String ffmpegPath) {
        this.ffmpegPath = ffmpegPath;
    }
}

创建template类

创建一个template类,这里就叫FFmpegTemplate,这里主要写一些工具类,例如转换格式啥的。

package com.masiyi.ffmpeg.template;

public class FFmpegTemplate {
    private String ffmpegPath;

    public FFmpegTemplate(String ffmpegPath) {
        this.ffmpegPath = ffmpegPath;
    }

    public FFmpegTemplate() {
    }
}


创建AutoConfiguration类

创建一个AutoConfiguration类,例如这里就叫FFmpegAutoConfiguration,这里主要写springboot核心:AutoConfiguration

别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter

package com.masiyi.ffmpeg.config;

import com.masiyi.ffmpeg.template.FFmpegTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(value = FFmpegProperties.class)
public class FFmpegAutoConfiguration {

    @Autowired
    private FFmpegProperties fFmpegProperties;


    @Bean
    public FFmpegTemplate getFFmpegTemplate() {
        return new FFmpegTemplate(fFmpegProperties.getFfmpegPath());
    }

}

创建spring.factories

在resources目录下创建一个 META-INF 文件夹,并且在下面创建一个叫做 spring.factories 的文件,里面的内容是

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.masiyi.ffmpeg.config.FFmpegAutoConfiguration

别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter

value改为你刚刚创建的AutoConfiguration全限定类名路径,什么?你居然不知道这个文件是干嘛的?建议看看我之前写的文章:

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?

总之,spring.factories 文件是 Spring Boot 自动配置机制的核心,它允许框架动态地发现和加载所需的组件,从而简化了应用的开发和部署流程。

至此,你就可以直接clean install了,这个打出来就是一个可以供别人引用的jar包了。

第五步,开始编写业务代码

我们首先知道我们需要什么,例如ffmpeg是一个强大的工具,我想写一个方法用于转换视频格式,那我就需要在FFmpegTemplate类中写入下面的代码:

package com.masiyi.ffmpeg.template;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class FFmpegTemplate {
    private static final Logger log = LoggerFactory.getLogger(FFmpegTemplate.class);

    private String ffmpegPath;

    public FFmpegTemplate(String ffmpegPath) {
        this.ffmpegPath = ffmpegPath;
    }

    public FFmpegTemplate() {
    }

    /**
     * 执行命令
     */
    public void execute(String command) throws IOException, InterruptedException {
        Process process = Runtime.getRuntime().exec(command);

        try (InputStream stdoutStream = process.getInputStream();
             BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(stdoutStream, "GBK"));
             InputStream stderrStream = process.getErrorStream();
             BufferedReader stderrReader = new BufferedReader(new InputStreamReader(stderrStream, "GBK"))) {

            Thread stdoutThread = new Thread(() -> {
                String line;
                try {
                    while ((line = stdoutReader.readLine()) != null) {
                        log.info("控制台输出: " + line);
                    }
                } catch (IOException e) {
                    log.error("读取标准输出时发生错误", e);
                }
            });

            Thread stderrThread = new Thread(() -> {
                String line;
                try {
                    while ((line = stderrReader.readLine()) != null) {
                        log.error("控制台输出: " + line);
                    }
                } catch (IOException e) {
                    log.error("读取错误输出时发生错误", e);
                }
            });

            stdoutThread.start();
            stderrThread.start();

            // Wait for the threads to finish reading
            stdoutThread.join();
            stderrThread.join();

            // Wait for the process to complete
            int exitCode = process.waitFor();

            if (exitCode == 0) {
                log.info("进程正常完成");
            } else {
                log.info("进程异常结束");
            }
        }
    }


    /**
     * 格式转换
     */
    public void convert(String inputFile, String outputFile) {
        StringBuilder command = new StringBuilder();
        command.append(ffmpegPath).append(" -i ").append(inputFile).append(" -y ").append(outputFile);
        try {
            execute(command.toString());
            log.info("格式转换成功");
        } catch (IOException | InterruptedException e) {
            log.error("格式转换失败", e);
        }
    }
}

写好之后,我们就可以使用mvn clean install打包到我们的maven本地仓库,如果你还想打包到maven公用仓库可以参考我这篇文章如何发布jar包到maven中央仓库(2024年3月最新版保姆级教程)

如果你只想打包到maven私服,可以参考这两篇文章:

Linux安装Nexus(图文解说详细版)

你入职的时候一定要问领导要的maven私服配置文件,它是什么?Nexus入门使用指南

第六步,引入我们的Starter

新建一个springboot项目,在pom文件下面添加我们的Starter路径

 		 <dependency>
            <groupId>io.gitee.wangfugui-ma</groupId>
            <artifactId>ffmpeg-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

最后再写个单元测试测试一下:

package com.masiyi.ffmpegspringbootstarterdemo;

import com.masiyi.ffmpeg.template.FFmpegTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class FfmpegSpringBootStarterDemoApplicationTests {

    @Autowired
    private FFmpegTemplate ffmpegTemplate;
    @Test
    void convert() {
        ffmpegTemplate.convert("D:\\video.mp4","D:\\video.avi");
    }

}


最后测试一下,发现测试通过:

别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter

MP4视频成功转换为avi格式。

仓库地址:

ffmpeg-spring-boot-starter-demo

ffmpeg-spring-boot-starter

至此,我们的Starter教程就完成了,创作不易,希望大家多多三连!

别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter

转载自:https://juejin.cn/post/7390319475520241716
评论
请登录