开发者

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

开发者 https://www.devze.com 2025-05-10 11:23 出处:网络 作者: Vic2334
目录springboot starter简介Starter 是什么什么是SpringBoot starter机制启动器starter命名配置项的命名规范为什么要自定义starter什么时候需要创建自定义starter自定义Starter所需依赖相关注解含义自定义Starter示例
目录
  • springboot starter简介
    • Starter 是什么
    • 什么是SpringBoot starter机制
    • 启动器starter命名
    • 配置项的命名规范
    • 为什么要自定义starter
    • 什么时候需要创建自定义starter
    • 自定义Starter所需依赖
    • 相关注解含义
  • 自定义Starter示例
    • 1、创建自定义的 Starter 工程
    • 2、引入依赖
    • 3、定义一个配置元数据类
    • 4、创建本项目具体实现类
    • 5、创建一个配置类
    • 6、定义自动配置的候选
    • 7、测试

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

在我们的日常开发工作中,经常会有js一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,

然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。

如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个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 demowww.devze.comProperties;
    public DemoService(DemoProperties demoProperties){
  http://www.devze.com      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(proxyBeanMethod编程客栈s = 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内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号