springboot实现自定义starter组件开发

引言

springboot 在java领域的应用可谓是独领风骚,细心的小伙伴都会发现springboot都是由一个个starter组件组成,无论是spring自带starter还是第三方集成starter都是如此,公司开发肯定会有一些是基础架构研发的,业务项目大多都需要依赖基础架构来进行业务开发,一般通用的工具、加解密、通信之类的都属于基础架构。如何通过自定义starter实现自己的组件开发。

springboot自动注入核心

spring-boot-autoconfiguration 包下面的spring.factories文件里面默认spring给配置了许多 EnableAutoConfiguration相关的配置注解类,这些都是springboot默认添加的配置类,如果我们要实现相应的starter也是如此即可。

自定义starter实现

idea创建empty project

分别新增pdf-spring-boot-starter和pdf-spring-boot-starter-autoconfigurue模块

注意:这里为啥默不是spring-boot-starter-xxx而是xxx-spring-boot-starter,是因为spring自建的starter是spring-boot-starter-xxx这样的,如果是第三方的建议xxx-spring-boot-starter,并不是什么强制规定,这是便于区分的写法而已。

pdf-spring-boot-starter-autoconfigurue新增配置

pom文件配置

xml 复制代码
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.6.5</version>
</parent>

<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.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.29</version>
  </dependency>
</dependencies>

编写PdfProperties

java 复制代码
@ConfigurationProperties(prefix = "wh.pdf")
public class PdfProperties {
    private int maxSize;
    private String fileDir;
    private String imageType;

    public int getMaxSize() {
        return maxSize;
    }

    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
    }

    public String getFileDir() {
        return fileDir;
    }

    public void setFileDir(String fileDir) {
        this.fileDir = fileDir;
    }

    public String getImageType() {
        return imageType;
    }

    public void setImageType(String imageType) {
        this.imageType = imageType;
    }
}

编写PdfHandlerService业务实现

java 复制代码
public class PdfHandlerService {
    private PdfProperties properties;
    public PdfProperties getProperties() {
        return properties;
    }
    public void setProperties(PdfProperties properties) {
        this.properties = properties;
    }
    /**
     * pdf转图片
     * @param path
     * @return
     * @throws IOException
     */
    public List<String> pdfToImage(String path) throws IOException {
        List<String> filePaths = new ArrayList<>();
        PDDocument pdDocument = PDDocument.load(new File(path));
        int pages = pdDocument.getNumberOfPages();
        PDFRenderer renderer = new PDFRenderer(pdDocument);
        for (int i = 0; i < pages; i++) {
            BufferedImage renderImage = renderer.renderImage(i);
            String filePath =  properties.getFileDir() + (i+1)+"."+properties.getImageType();
            ImageIO.write(renderImage, properties.getImageType(), new File(filePath));
            filePaths.add(filePath);
        }
        // 关闭文档
        pdDocument.close();
        return filePaths;
    }
}

编写PdfConfiguration配置类

less 复制代码
@Configuration
@ConditionalOnClass({PdfHandlerService.class})
@EnableConfigurationProperties(PdfProperties.class)
public class PdfConfiguration {
    // spring容器会接管PdfHandlerService,这样在引入自定义starter后直接使用@Autowired就可以直接使用
    @Bean
    public PdfHandlerService pdfHandlerService(PdfProperties pdfProperties){
        PdfHandlerService pdfHandlerService = new PdfHandlerService();
        pdfHandlerService.setProperties(pdfProperties);
        return pdfHandlerService;
    }
}

创建META-INF/spring.factories添加自动注入配置类

pdf-spring-boot-starter配置

pom.xml配置

xml 复制代码
<dependencies>
  <dependency>
    <groupId>org.wh</groupId>
    <artifactId>pdf-spring-boot-starter-autoconfigurer</artifactId>
    <version>1.1.0</version>
  </dependency>
</dependencies>

starer可以写相关组件的代码,我这里演示没有写

本地创建jar文件

实际生产开发自然是加入公司自己的仓库中去,以便项目引用

验证测试

本地项目引入

application.yml文件添加配置

编写单元测试

相关推荐
怕浪猫8 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
喵了几个咪9 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
Flynt9 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
_孤傲_11 小时前
快速掌握 MySQL 语法
数据库·后端·mysql
考研保研资料分享12 小时前
无论文竞赛保研中科院植物所:三场考核、科研追问与准备复盘
面试
救救孩子把13 小时前
AI面试八股文-23_23-Agent可观测性与生产监控面试题
人工智能·面试·职场和发展·agent·langsmith·langfuase
IT_陈寒13 小时前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
步行cgn13 小时前
Thymeleaf 编辑表单详解:从字段回填到模拟 PUT 请求
后端
Song_RsHt14 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
学长毕设14 小时前
基于SpringBoot的建筑材料管理系统-附源码
java·spring boot·后端