别光会引用别人的Starter,来写一个独属于自己的SpringBootStarter
之前写了很多的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的结构
在java根目录下创建你的软件包
添加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
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
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私服,可以参考这两篇文章:
你入职的时候一定要问领导要的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");
}
}
最后测试一下,发现测试通过:
MP4视频成功转换为avi格式。
仓库地址:
ffmpeg-spring-boot-starter-demo
至此,我们的Starter教程就完成了,创作不易,希望大家多多三连!
转载自:https://juejin.cn/post/7390319475520241716