springboot starter介绍与自定义starter示例详解

 更新时间:2025年05月07日 16:19:28   作者:Vic2334  
Spring Boot 的 Starter 是一组比较方便的依赖描述符,可以通过 Maven 将其打成jar包,并在你的项目中直接引用,这篇文章主要介绍了springboot starter介绍与自定义starter示例,需要的朋友可以参考下

springboot starter简介

Starter 是什么

Spring Boot 的 Starter 是一组比较方便的依赖描述符,可以通过 Maven 将其打成jar包,并在你的项目中直接引用。

通过 Starter 你可以获取该功能的所有依赖,以及统一的配置,避免了复制、粘贴代码和依赖带来的麻烦。

Starter 主要使用了自动配置,所以它下面的所有组件会被 Spring Boot 通过META-INF/spring.factories文件注入IOC容器中。

什么是SpringBoot starter机制

SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。

启动器starter命名

#官方
spring-boot-starter-jdbc
spring-boot-starter-web
spring-boot-starter-freemarker
#第三方
sms-spring-boot-starter
myLog-spring-boot-starter

配置项的命名规范

如果自定义的 Starter 包含了配置项,请为它使用唯一的命名空间,不要与 Spring Boot 或其他组件产生冲突,例如:serverspring

为什么要自定义starter

在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,
然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。
如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,
SpringBoot为我们完成自动装配,简直不要太爽

什么时候需要创建自定义starter

在我们的日常开发工作中,可能会需要开发一个通用模块,以供其它工程复用。SpringBoot就为我们提供这样的功能机制,
我们可以把我们的通用模块封装成一个个starter,这样其它工程复用的时候只需要在pom中引用依赖即可,
由SpringBoot为我们完成自动装配。

常见场景:
1.通用模块-短信发送模块
2.基于AOP技术实现日志切面
3.微服务项目的数据库连接池配置
4.微服务项目的每个模块都要访问redis数据库,每个模块都要配置redisTemplate
也可以通过starter解决

自定义Starter所需依赖

在POM中引入两个依赖:

  • spring-boot-starter:该依赖是 Starter 的核心,包括自动配置、日志和YAML的支持。我们所有自定义的 Starter 都应该直接或间接的引入该依赖。
  • spring-boot-configuration-processor:包含一个 Java 注解处理器,当使用@ConfigurationProperties注解配置自己的元数据时,需要引入此依赖。其作用是生产配置元数据,能够在配置文件中给与提示,比如server.port
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

其中<optional>true</optional>

父模块的依赖中添加<optional>true</optional>,在这种情况下,在子模块中会直接下载该依赖jar包,对于<optional>true</optional>来说,父模块中是否加上<dependencyManagement>都一样,都是需要显示调用才能引用该依赖的jar包

相关注解含义

@Configuration //指定这个类是一个配置类
@ConditionalOnXXX //在指定条件成立的情况下自动配置类生效
@AutoConfigureOrder //指定自动配置类的顺序
@AutoConfigureBefore //在特定自动装配Class之前
@AutoConfigureAfter //在特定自动装配Class之后
@Bean //给容器中添加组件
@ConfigurationPropertie //结合相关xxxProperties类来绑定相关的配置
@EnableConfigurationProperties //让xxxProperties生效加入到容器中
自动配置类要能加载 将需要启动就加载的自动配置类,配置在META‐INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
@Conditional:按照一定的条件进行判断,满足条件给容器注册bean
@ConditionalOnMissingBean:给定的在bean不存在时,则实例化当前Bean
@ConditionalOnProperty:配置文件中满足定义的属性则创建bean,否则不创建
@ConditionalOnBean:给定的在bean存在时,则实例化当前Bean
@ConditionalOnClass: 当给定的类名在类路径上存在,则实例化当前Bean
@ConditionalOnMissingClass :当给定的类名在类路径上不存在,则实例化当前Bean

自定义Starter示例

1、创建自定义的 Starter 工程

创建一个 Spring Boot 工程,将其命名为demo-spring-boot-starter

2、引入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.14</version>
</parent>
<dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
         <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

3、定义一个配置元数据类

自定义一个配置元数据类DemoProperties,用于映射YAML中的配置,使用@ConfigurationProperties注解需要指定配置项的前缀,此处的前缀为mysyu。yml文件中提示时可以使用:mysyu.name

包名可以命名为cn.xx.autoconfigure

/**
 * @ConfigurationProperties:将该类中所有的属性和配置文件中的相关配置进行绑定。
 */
@Component
@ConfigurationProperties(prefix = "mystu")
@Getter
@Setter
public class DemoProperties {
    /**
     * 属性
     */
    private String name;
    private String sex;
    private String age;
}

4、创建本项目具体实现类

/**
 * 这里是写 这个项目获取到了配置之后具体要做什么
 * 这个例子只是简单演示starter基本使用 只是输出
 * 比如配置的是发送短信,那么这里获取到手机号参数后 可以实现发送功能代码
 */
public class DemoService {
    private DemoProperties demoProperties;
    public DemoService(DemoProperties demoProperties){
        this.demoProperties = demoProperties;
    }
    public void print(){
        System.out.println("获取到的姓名:"+demoProperties.getName());
        System.out.println("获取到的性别:"+demoProperties.getSex());
        System.out.println("获取到的年龄:"+demoProperties.getAge());
    }
}

5、创建一个配置类

DemoAutoConfiguration,可以放在和元数据类一个包下

// 该类为一个配置类
@Configuration(proxyBeanMethods = false)
// @ConditionalOnClass是Spring Boot中的一个条件注解,它用于指定某个类存在时,才会创建并初始化被注解的Bean。
// 放在这里就是容器中有DemoService组件  才会创建DemoAutoConfigure
@ConditionalOnClass(value = {DemoService.class})
// 导入我们自定义的配置类,供当前类使用
@EnableConfigurationProperties(value = DemoProperties.class)
public class DemoAutoConfigure {
    @Bean
    // 容器中不存在这个对象,才会实例化一个Bean
    @ConditionalOnMissingBean(DemoService.class)
    public DemoService helloService(DemoProperties demo) {
        //把获取的信息注入
        DemoService demoService = new DemoService(demo);
        return demoService;
    }
}

@Configuration(proxyBeanMethods = false)

首先引出两个概念:Full 全模式,Lite 轻量级模式

  • Full(proxyBeanMethods = true) :proxyBeanMethods参数设置为true时即为:Full 全模式。 该模式下注入容器中的同一个组件无论被取出多少次都是同一个bean实例,即单实例对象,在该模式下SpringBoot每次启动都会判断检查容器中是否存在该组件
  • Lite(proxyBeanMethods = false) :proxyBeanMethods参数设置为false时即为:Lite 轻量级模式。该模式下注入容器中的同一个组件无论被取出多少次都是不同的bean实例,即多实例对象,在该模式下SpringBoot每次启动会跳过检查容器中是否存在该组件
  • 什么时候用Full全模式,什么时候用Lite轻量级模式?当在你的同一个Configuration配置类中,注入到容器中的bean实例之间有依赖关系时,建议使用Full全模式当在你的同一个Configuration配置类中,注入到容器中的bean实例之间没有依赖关系时,建议使用Lite轻量级模式,以提高springboot的启动速度和性能

6、定义自动配置的候选

resources资源目录中增加文件META-INF/spring.factories,并将自定义的配置类DemoAutoConfiguration加入到自动配置类列表中,如下代码:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.xx.autoconfigure.DemoAutoConfigure

把自动配置类DemoAutoConfiguration配置到org.springframework.boot.autoconfigure.EnableAutoConfiguration的key下,springboot会自动加载该文件并根据条件装配

Spring Boot 会检查所有发布的jar中是否包含META-INF/spring.factories文件,并将该文件中目标类注入IOC容器中,自动配置类就是使用这种方式加载的。

7、测试

以上步骤都完成后 使用maven命令打包

mvn clean install -Dmaven.test.skip=true

或者通过IDEA 的install打包

最后在需要导入该项目的地方引入这个项目依赖并测试

到此这篇关于springboot starter介绍与自定义starter示例的文章就介绍到这了,更多相关springboot 自定义starter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Hutool实现文件上传的使用示例

    SpringBoot整合Hutool实现文件上传的使用示例

    文件上传在项目经常会用到,本文主要介绍了SpringBoot整合Hutool实现文件上传的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Java进阶学习:网络服务器编程

    Java进阶学习:网络服务器编程

    Java进阶学习:网络服务器编程...
    2006-12-12
  • java中struts2实现文件上传下载功能

    java中struts2实现文件上传下载功能

    这篇文章主要介绍了java中struts2实现文件上传下载功能的方法,以实例形式分析了struts2文件上传下载功能的实现技巧与相关问题,具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • java实现文件拷贝的七种方式

    java实现文件拷贝的七种方式

    这篇文章主要介绍了java实现文件拷贝的七种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • SpringBoot文件上传的几种常见方式(单文件上传、多文件上传)

    SpringBoot文件上传的几种常见方式(单文件上传、多文件上传)

    本文详解SpringBoot文件上传实现,涵盖单文件、多文件上传及大小类型限制方法,强调隐私保护与非法文件防范的社会责任,适配不同场景需求,提供技术解决方案与合规实践指导,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • 如何在Java SpringBoot项目中配置动态数据源你知道吗

    如何在Java SpringBoot项目中配置动态数据源你知道吗

    这篇文章主要介绍了SpringBoot如何在运行时动态添加数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • Java CAS与JUC组件详解

    Java CAS与JUC组件详解

    CAS是一种基于乐观锁的无锁并发控制技术,其核心逻辑可以概括为:“我认为当前值应该是A,如果是,则更新为B;否则放弃或重试”,整个过程由硬件保证原子性,无需传统锁机制,本文给大家介绍Java CAS与JUC组件的相关知识,感兴趣的朋友一起看看吧
    2025-04-04
  • eclipse实现DSA数字签名

    eclipse实现DSA数字签名

    这篇文章主要为大家详细介绍了eclipse实现DSA数字签名算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • SpringBoot中使用Session共享实现分布式部署的示例代码

    SpringBoot中使用Session共享实现分布式部署的示例代码

    这篇文章主要介绍了SpringBoot中使用Session共享实现分布式部署的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Spring中@Transactional注解关键属性和用法小结

    Spring中@Transactional注解关键属性和用法小结

    在Spring框架中,@Transactional 是一个注解,用于声明事务性的方法,它提供了一种声明式的事务管理方式,避免了在代码中直接编写事务管理相关的代码,本文给大家介绍@Transactional 注解的一些关键属性和用法,感兴趣的朋友一起看看吧
    2023-12-12

最新评论