在SpringBoot中如何自定义starter

SpringBoot自定义starter 目录前言`SpringBoot` 自定义 `starter`创建多模块项目项目编码`custom-spring-boot-starter` 父模块依赖`hello-spring-boot-starter-autoconfigure` 子模块 前言 今天看到了一道面试题,如何实现一个自定义的 SpringBoot starter,或者说,SpringBoot 如何加载我们自己的 jar 包?其实,仔细想想本质是考察 SpringBoot 的自动配置原理,了解了其自动配置原理即可实现 SpringBoot 自定 阅读详情

写在前面

SpringBoot 提供了很多开箱即用的starter依赖,将其称为场景启动器,使得我们在开发业务代码时能够非常方便的、快速的完成框架的引入,为我们省去了之前很多的配置操作,无需过多关注框架的配置,摆脱了各种依赖库的处理和配置各种信息的困扰,甚至有些功能的开启只需要在启动类或配置类上增加一个注解即可完成。SpringBoot会自动发现符合上下文场景的Bean对象,并注册到IOC容器中。
一句话:SpringBoot为了简化开发,将常用场景抽取成了一个个的Starter,供外部使用。
那么我们想要自己实现自己的 starter需要怎么做呢?下面就开始介绍如何实现自定义的starter。

什么是STARTER?

Starter是一个可拔插的插件,提供一系列依赖描述符,应用程序只需要在pom文件中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。

应用场景

在实际的开发过程中,经常会有一些相对独立的、可重用的模块。我们如果将这些模块封装成一个个starter,复用时只需要将其在pom中引用依赖,让SpringBoot为我们完成自动装配,是不是更合理更方便呢?

官方文档

官方关于STARTER的介绍

命名规范

①. Spring官方的Starter一般采取spring-boot-starter-XXX的格式,如:spring-boot-starter-web、spring-boot-starter-jdbc; ②. 而非官方的、自定义的Starter,官方建议 artifactId 命名应遵循XXX-spring-boot-starter的格式,如:droolsx-spring-boot-starter、mybatis-spring-boot-starter。

实现步骤

第1步创建一个 SpringBoot 项目,并添加下面两个依赖到 pom.xml 文件当中:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>spring-boot-starter-logging</artifactId>
                <groupId>org.springframework.boot</groupId>
            </exclusion>
        </exclusions>
        <optional>true</optional>
        <version>${spring-boot.version}</version>
    </dependency>
    <!-- 主要是为了生成spring-configration-metadata.json文件,支持idea跳转 -->
    <!-- @ConfigurationProperties annotation processing (metadata for IDEs) -->
    <dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-configuration-processor</artifactId>
	    <optional>true</optional>
    </dependency>
</dependencies>

①. spring-boot-starter,所有场景启动器最底层的依赖;
②. spring-boot-configuration-processor,用来在编译时生成 spring-configuration-metadata.json,当引入该starter后,在 application.yml 中配置该starter的相关属性时,可以用 ctlr + 鼠标左键点击属性名,会跳转到你配置此属性的类中,简而言之:它可以生成配置类的提示文件。


第2步定义配置类映射所有的配置信息,用于接受application.yml中注入的属性,并绑定映射到这个配置类上:

package com.hadoopx.drools.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author ROKCY
 * 第2步. 定义配置类映射配置信息
 */

@Data
@ConfigurationProperties(prefix = "spring.drools")
public class DroolsProperties {

    // 规则文件和决策表的路径(多个目录使用逗号分割)
    private String path;

    // 更新缓存的轮询周期 - 单位:秒(默认30秒)
    private Long update;

    // 模式: stream 或 cloud(默认stream模式)
    private String mode;

    // 是否开启监听器:on = 开, off = 关闭(默认开启)
    private String listener;

    // 自动更新:on = 开, off = 关闭(默认开启)
    private String autoUpdate;

    // 是否开启DRKL的语法检查: on = 开, off = 关闭(默认)
    private String verify;
}

第3步定义自动配置类:

package com.hadoopx.drools.config;
import com.hadoopx.drools.KieSchedule;
import com.hadoopx.drools.KieTemplate;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Objects;
import static com.hadoopx.drools.common.Constants.LISTENER_CLOSE;

/**
 1. @author ROKCY
 2. 第3步. 定义自动配置类
 */
@Configuration
@EnableConfigurationProperties(DroolsProperties.class)
public class DroolsConfig {

    @Bean
    @ConditionalOnMissingBean(name = "kieTemplate")
    public KieTemplate kieTemplate(DroolsProperties droolsProperties) {
        KieTemplate kieTemplate = new KieTemplate();
        kieTemplate.setPath(droolsProperties.getPath());
        kieTemplate.setMode(droolsProperties.getMode());
        String autoUpdate = droolsProperties.getAutoUpdate();
        if (Objects.equals(LISTENER_CLOSE, autoUpdate)) {
            // 关闭自动更新
            kieTemplate.setUpdate(999999L);
        } else {
            // 启用自动更新
            kieTemplate.setUpdate(droolsProperties.getUpdate());
        }
        kieTemplate.setListener(droolsProperties.getListener());
        kieTemplate.setVerify(droolsProperties.getVerify());
        return kieTemplate;
    }

    @Bean
    @ConditionalOnMissingBean(name = "kieSchedule")
    public KieSchedule kieSchedule(KieTemplate kieTemplate) {
        KieSchedule kieSchedule = new KieSchedule(kieTemplate);
        kieSchedule.execute();
        return kieSchedule;
    }
}
@ConfigurationProperties(prefix = "spring.drools"),它的作用就是从YMl配置文件中绑定属性到对应的Bean(DroolsProperties)上; @EnableConfigurationProperties,负责导入这个已经绑定了属性的Bean到Spring容器中。

注意代码中用到的注解,下面将SpringBoot 中的所有 @Conditional 注解及作用进行描述:

@ConditionalOnBean:  当容器中有指定类型的Bean的条件下,才注入容器,否则不注入容器
@ConditionalOnClass: 当类路径下有指定的类的条件下,才注入容器,否则不注入容器
@ConditionalOnExpression:  基于SpEL表达式作为判断条件
@ConditionalOnJava:        基于JVM版本作为判断条件
@ConditionalOnJndi:        在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean: 当容器中没有指定类型Bean的情况下,才注入容器,否则不注入容器
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下
@ConditionalOnNotWebApplication: 当前项目不是Web项目的条件下
@ConditionalOnProperty: 指定的属性是否有指定的值
@ConditionalOnResource: 类路径下是否有指定的资源
@ConditionalOnSingleCandidate: 当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean
@ConditionalOnWebApplication:  当前项目是Web项目的条件下

所以,通过第2、3步,可以将全局配置的属性如:spring.drools.path等,通过@ConfigurationProperties注解,绑定到对应的DroolsProperties配置实体类上,然后再通过@EnableConfigurationProperties注解将这个配置实体类导入到Spring容器中。


第4步让配置类加载生效,使用spring.factories将自动配置类注入到Spring容器中,在resources/META-INF/下创建spring.factories文件,并添加如下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.hadoopx.drools.config.DroolsConfig

第5步根据实际业务定义starter要实现的功能业务逻辑。


第6步去掉pom.xml文件中的spring-boot-maven-plugin插件:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

总结

要完成自定义的starter需要提供:一个配置实体类XXXProperties.java、一个或者多于一个的自动配置类XXXAutoConfiguration.java、一组业务逻辑类,另外注意pom文件的配置。
看源码会发现有些starter是提供了两个jar,一个jar专门定义autoconfiguration,另一个jar仅仅引用上一个jar,这两种方式都可以,如下:
mybatis-spring-boot-starter

SpringBoot中自定义Starter 1. 前置知识1-1 什么是Starter?1-2 常用的Condition注解说明1-3 Starter的命名规范2. 自定义自己的Starter示例2-1 创建Starter项目2-2 Pom.Xml【示例引入了spring-boot-starter和lombok】2-3-1 配置类:PersonProperties2-3-2 业务类:PersonService2-3-3 自动配置类:PersonAutoConfiguration2-4 创建spring.factories文件。 阅读详情

相关推荐

springboot自定义starter | Spring Boot 6

1、什么是线程池 2、Java自带有哪几种线程池 3、Java中有几种类型的流 4、字节流如何转为字符流 5、请写出你最常见的5个RuntimeException 6、JVM内存分哪几个区,每个区的作用是什么? 7、heap和stack有什么区别 8、Java类加载过程 9、什么是类加载器,类加载器有哪些 10、Java中垃圾收集的方法有哪些 11、如何判断一个对象是否存活(或者GC对象的判断方法) 12、简述Java内...

学Java,找哪吒 4704

SpringBoot之自定义starter

目录 一、什么是SpringBoot starter机制 二、为什么要自定义starter 三、什么时候需要创建自定义starter 四、自动加载核心注解说明 五、自定义starter的开发流程 案例一:为短信发送功能创建一个starter 案例二:AOP方式统一服务日志 一、什么是SpringBoot starter机制 SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入sta.

qq_52445443的博客 1万+

Ubuntu22.04下,用Fast-LIVO2+3DGS重建桌面小物件:从点云到高清模型的保姆级避坑实录

本文详细介绍了在Ubuntu22.04环境下,使用Fast-LIVO2与3DGS技术进行桌面小物件三维重建的完整流程。从环境配置、数据采集到点云-图像对齐和3DGS训练,提供了针对小物件优化的参数设置和避坑指南,帮助用户实现媲美商业扫描仪的高清模型重建效果。

weixin_30897233的博客 399

Spring Boot之自定义Starter

在Spring Boot中,自定义Starter是一种方便的方式来封装和共享一组相关的依赖项和配置。自定义Starter可以简化应用程序的配置,并提供一致的依赖项管理。

积跬步,至千里。 4789

东方财富网 数据访问接口及字段说明

东方财富网 数据访问接口和字段说明

雨中山草 2万+

【数据分享】中国371个城市的坡度矢量数据和excel数据

在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个城市坡度数据的相关情况,包括数据概况、生成流程、应用场景等内容,为读者呈现一份详尽的坡度数据指南。

qq_39719713的博客 1844

【springboot 之自定义starter】

starter运行原理及其如何自定义一个starter

ypykip博客 2989

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 619

教你如何实现自定义SpringBootStarter

教你如何实现自定义SpringBootStarter

qq_42394044的博客 1万+

从服务器到桌面超算:当3999美元的NVIDIA DGX Spark装上Ubuntu,普通开发者能玩出什么花?

DGX Spark的出现,标志着AI算力正在经历从"数据中心集中供给"到"个人桌面按需拥有"的范式转移。它让开发者可以在本地完成从数据预处理、模型微调到推理验证的全流程,只有在需要大规模训练时才调用云端资源。迭代速度:从按小时计费的云端调试,变成随时随地的本地实验数据主权:敏感信息永不离开本地成本可控:一次投入,长期使用,不受API调用次数限制AI算力民主化的时代,真的来了。你的下一台超级计算机,不必在云端。它就在你的桌面上,安静地等待着你的下一个创意。附录:实用资源。

QQ_778132974的博客 623

点到面点云配准(Point To Plane)算法知识详解和详细推导,C++代码实现

点到面 ICP (Iterative Closest Point) 是在 3D 点云配准中常见的一种变体,通过最小化点到对应面(由法向量定义的局部平面)的距离来提高收敛速度和精度。

qq_36812406的博客 1811

【Spring Boot】自定义springboot starter

自定义springboot starter

qq_41466440的博客 1139

Power domain 划分该如何下手

假如PD1比PD3更always on的话,我们只需要插入普通buffer即可,因为PD3 on,PD1也肯定是ON,PD1 off,PD3肯定时off,PD1能cover PD3的电源情况,因此使用普通buffer也可,但是处于省电角度,我们还是使用AO buffer;在我们做多power domain时,在切分power domain时,需要谨慎,稍有不慎,就会出现congestion以及timing问题,那问题来了,我们在切分power domain时有什么考究么,今天小编就和大家一起讨论讨论。

芯冰乐 207

SpringBoot四大核心之starter——自定义starter

四大核心 1、starter:jar包的引入,解决jar版本冲突问题 2、自动装配:简单配置甚至零配置即可运行项目 3、actuator:springboot程序监控器 4、CLI:命令行 starter starter的命名有一种习惯,官方的starter一般都是spring-boot-starter-xxx,而我们自定义的starter一般都是xxx-spring-boot-starter。 首先我们需要明白一件事,就是我们自定义的bean是可以自动装配过来的,而我们第三方自定义的starter

1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【SpringBoot】实现自定义 spring-boot-starter

Spring Boot 的依赖管理、实现一个自定义的 spring-boot-starter

sun_tantan的博客 1648

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Springboot】自定义starter

想要自定义starter,首先要了解springboot是如何加载starter的,也就是springboot的自动装配机制。SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。

weixin_44823875的博客 1964

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【SpringBoot】Spring Boot Starter 详解与实战:手把手自定义 Starter

在传统 Spring 项目中,如果我们想使用Spring + MyBatis + Druid 连接池,通常需要手动添加多个依赖,并编写相关配置:</</</</</</</</然后还要写DataSource配置类、MyBatis 配置等。而的作用就是把这些繁琐的配置封装起来,让开发者只需要引入一个 Starter 依赖,即可自动装配所有组件。例如,使用只需这样:</</</无需手动配置DataSource,Spring Boot 会自动装配数据库相关的 Bean,大大减少了开发成本。

工一木子 2372

SpringBoot-自定义Starter精华版

​ 开发的自定义 Starter 需求是,项目依赖starterTest-spring-boot-starter,starterTest-spring-boot-starter 又加载HelloAutoConfiguration,HelloAutoConfiguration自动产生HelloService,项目中引入 starterTest-springboot-start后,用户便可以使用HelloAutoConfiguration 产生的 HelloService 了

小孔靠得住的博客 2157

重学SpringBoot3-自定义starter

Spring Boot 简化了基于 Spring Framework 的应用程序开发,Spring Boot 的核心功能之一就是 Starter,它极大简化了项目的依赖管理和配置,帮助开发者快速启动项目。而在 Spring Boot 3 中,Starter 仍然是一个至关重要的组件,并进行了很多改进和增强。

CoderJia的学习之路 1644

SpringBoot 自定义 Starter:从零开发一个私有 Starter

用过 SpringBoot 的都知道,引入一个 starter(比如 spring-boot-starter-web、spring-boot-starter-redis),就能实现开箱即用,不用手动配置。答:SpringBoot 启动时,会通过 SpringFactoriesLoader 工具类,读取 classpath 下 META-INF/spring.factories 文件,该文件中配置了自动配置类的全类名,SpringBoot 会加载这些自动配置类,结合条件注解筛选后,注入对应的 Bean。

。。。 1172

【SpringBoot】【Starter】----SpringBoot Starter 全解:原理、场景、实战自定义 Starter

Starter是SpringBoot提供的一站式依赖封装组件,是官方简化开发的核心设计。它把一类功能所需的依赖包、自动配置类统一打包,开发者无需手动管理版本、导入多个jar。├── custom-log-spring-boot-starter # 依赖聚合模块└── custom-log-spring-boot-autoconfigure # 自动配置核心模块pom.xml</</</</application.yml 配置custom:log:prefix: 项目统一日志官方Starter。

记录生活 225
上一篇: 在SpringBoot项目的POM文件中添加spring-boot-configuration-processor的作用是什么?
下一篇: SpringBoot - @Configuration注解使用详解
cloneme01
博客等级 码龄20年 2万+粉丝 248原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值