首页 > 其他分享 >SpringBoot自定义Starter指南

SpringBoot自定义Starter指南

时间:2024-11-13 17:16:14浏览次数:3  
标签:SpringBoot 自定义 spring 配置 boot Bean Starter starter 加载

SpringBoot的Starter自动配置机制极大地简化了依赖管理和应用配置,使得开发者可以以最少的配置快速启动和运行Spring应用。

有时,标准的Starter可能无法满足特定需求,这时我们可以创建自定义Starter来扩展SpringBoot的功能。

什么是SpringBoot Starter

SpringBoot Starter是一个特殊的依赖描述符,它包含了一系列的库依赖,这些库依赖定义了某个功能领域(如web应用、数据库访问等)所需的所有类库。SpringBoot通过spring-boot-autoconfigure模块提供的自动配置机制来自动配置这些依赖。

Web应用开发

  • spring-boot-starter-web:用于创建Web应用和RESTful服务,包含Tomcat和Spring MVC。
  • spring-boot-starter-webflux:用于构建响应式Web应用,基于Reactor和Spring WebFlux。

数据库访问

  • spring-boot-starter-data-jpa:集成Spring Data JPA和Hibernate,用于关系数据库的操作。
  • spring-boot-starter-data-mongodb:用于与MongoDB数据库的集成。
  • spring-boot-starter-data-redis:用于与Redis键值存储的集成。

库依赖

把具备某些功能的坐标打包到一起,简化依赖导入。

比如导入了spring-boot-starter-web这个starter,那么和web相关的jar包都一起自动导入到项目中了。

在这里插入图片描述

自动配置

无需手动配置xml,由starter进行自动配置并管理bean,简化开发过程。

mybatis-spring-boot-starter为例。

1)当引入了mybatis-spring-boot-starter后,其引入的相关依赖如下:

在这里插入图片描述

2)它导入了一个mybatis-spring-boot-autoconfigure 的jar包,其中有一个自动配置类MybatisAutoConfiguration

在这里插入图片描述

3)打开看看,里面的关键代码

在这里插入图片描述

4)其中@Configuration@Bean注解,结合使用替代传统的xml配置文件,把SqlSessionTemplateSqlSessionFactory注入到Spring容器。

注解@EnableConfigurationProperties,其作用是让后面指定的配置属性MybatisProperties类生效。

在这里插入图片描述
把此类标记为一个配置属性类,prefix指定了前缀,其属性就是配置的可选参数。

如配置包的别名:mybatis.type-aliases-package=com.yyh.entity

5)那么这个MybatisAutoConfiguration类是怎么被加载的呢?

META-INF/spring.factories文件中,定义了MybatisAutoConfiguration

在这里插入图片描述
当 SpringBoot 应用程序启动时,会去加载该 jar 包下的META-INF/spring.factories文件。

详情可以参考:SpringBoot自动装配原理解析

命名规范

spring-boot-starter-xxx是SpringBoot官方定义的jar,如 spring-bbot-starter-web。
xxx-spring-boot-starter是非官网定义的,如第三方jar包 mybatis-spring-boot-starter。

自定义 Starter

一般来说,需要我们自定义 starter 的原因如下:

  • 封装功能:封装一组特定的功能,使其可以轻松地在其他项目中复用。
  • 简化配置:自动配置相关类库,减少重复的配置工作。
  • 模块化设计:保持应用的模块化,将特定功能隔离在单独的模块中。

比如,我们现在要新建一个 token-redis-spring-boot-starter

1)新建项目,配置 pom。

在这里插入图片描述
2)在包util下创建类TokenProperties,此类是一个配置属性类。

在这里插入图片描述
3)在包service下创建类TokenService,作为一个服务。

在这里插入图片描述
4)在包config下创建类TokenAutoConfiguration,实现自动配置,把服务注入到Spring中。

在这里插入图片描述
5)创建 spring.factories文件

#后面的路径是TokenAutoConfiguration所在的路径
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.demo.config.TokenAutoConfiguration

6)把项目打包发布到 maven 仓库。

7)新建一个项目,并引入token-redis-spring-boot-starter

在这里插入图片描述
8)在配置文件中配置
在这里插入图片描述
9)测试运行
在这里插入图片描述
输出:127.0.0.1,0000,8888888

条件注解

在文中出现了好几个类似于这样的注解@ConditionalXXX

比如:@ConditionalOnProperty@ConditionalOnClass@ConditionalOnMissingBean

@Conditional 是在 SpringFramework 4.0 版本正式推出的,它可以让 Bean的装载基于一些指定的条件,换句话说,被标注 @Conditional 注解的 Bean 要注册到 IOC 容器时,必须全部满足 @Conditional 上指定的所有条件才可以。

@ConditionalOnProperty

@ConditionalOnProperty 注解用于根据配置文件中的属性值来决定是否加载某个自动配置类。

  • 属性名称:可以指定一个或多个属性名称,只有当这些属性被设置时,自动配置类才会被加载。
  • 属性值:可以进一步指定需要匹配的属性值,只有当属性的值与指定值相匹配时,自动配置类才会被加载。
@Configuration
@EnableConfigurationProperties({TokenProperties.class})
@ConditionalOnProperty(
    value = {"token.enabled"},
    havingValue = "true"
)
public class TokenAutoConfiguration {
    public TokenAutoConfiguration() {
    }

    @Bean
    public TokenService tokenService() {
        return new TokenService();
    }
}

在这个例子中,只有当配置文件中存在token.enabled属性,TokenAutoConfiguration类才会被加载。

@ConditionalOnClass

@ConditionalOnClass 注解用于检查类路径上是否存在某个类,如果存在,则加载自动配置类。

  • classes:指定一个或多个类,如果这些类在类路径上被找到,自动配置类就会被加载。
@Configuration
@ConditionalOnClass(name = {"com.mysql.cj.jdbc.Driver"})
public class MySqlAutoConfiguration {
    // ...
}

在这个例子中,只有当类路径上存在com.mysql.cj.jdbc.Driver类时,MySqlAutoConfiguration类才会被加载,这通常意味着MySQL JDBC驱动已经添加到了项目的依赖中。

@ConditionalOnMissingBean

@ConditionalOnMissingBean 注解用于检查Spring容器中是否已经存在某个特定的Bean,如果不存在,则创建一个新的Bean。

  • value:指定需要检查的Bean的类型。
  • search:指定搜索Bean的范围,默认为SearchStrategy.ALL,意味着在当前上下文和父上下文中搜索。
@Configuration
public class MyServiceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(MyService.class)
    public MyService myService() {
        return new DefaultMyService();
    }
}

在这个例子中,如果Spring容器中没有MyService类型的Bean,那么myService方法将被调用以创建一个新的MyService Bean。

组合使用条件注解

这些条件注解可以单独使用,也可以组合使用,以满足更复杂的条件判断需求。

例如,可以同时使用@ConditionalOnProperty@ConditionalOnClass来确保某个自动配置类只在满足特定属性值和类路径上有特定类时才被加载。

@Configuration
@ConditionalOnProperty(name = "myapp.enabled")
@ConditionalOnClass(name = "com.mysql.cj.jdbc.Driver")
public class MySqlAutoConfiguration {
    // ...
}

在这个例子中,MySqlAutoConfiguration只有在配置文件中设置了myapp.enabled属性,并且类路径上存在com.mysql.cj.jdbc.Driver类时才会被加载。

标签:SpringBoot,自定义,spring,配置,boot,Bean,Starter,starter,加载
From: https://blog.csdn.net/yqq962464/article/details/143734284

相关文章

  • 【Java】自定义注解的使用
    什么是注解java中的,注解分为两种,元注解和自定义注解,类似于公理和定理的关系。我们常用一些注解:@Autowired、@Override等都是自定义注解。在JAVA中如何实现自定义注解?@interface关键字我们想定义一个自己的注解需要使用@interface来定义。//元注解@Target(ElementType.ME......
  • springboot毕设 奶茶物料管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着奶茶行业的蓬勃发展,奶茶店的数量急剧增加,市场竞争日益激烈。奶茶店的日常运营中,物料管理成为决定其运营效率与成本控制的关键因素。传统的物料管......
  • springboot毕设高校毕业生就业岗位推荐系统源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着高校的不断扩招,毕业生数量逐年递增,就业市场的竞争日益激烈。在这样的大环境下,高校毕业生面临着巨大的就业压力。一方面,毕业生需要花费大量的......
  • springboot毕设基于JavaWeb的校园点餐平台源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着校园数字化建设的不断推进以及学生生活节奏的加快,传统的校园餐饮模式面临着诸多挑战。目前,校园内餐饮需求多样且分散,学生在点餐过程中往往需......
  • 一个C#winform编写的2D数据曲线显示控件,三个Y轴,自定义曲线图表控件,电压电流实时数据曲
    一个C#winform编写的2D数据曲线显示控件,三个Y轴,自定义曲线图表控件,电压电流实时数据曲线,电压电流轨迹曲线实时刷新,点击显示此处数据(附下载链接)调用该控件案例截图如下所示:点我下载此资源》》》》》》》》......
  • springboot将文件处理成压缩文件
    前言在工作我们经常会出现有多个文件,为了节省资源会将多个文件放在一起进行压缩处理;为了让大家进一步了解我先将springboot处理的方法总结如下,有不到之处敬请大家批评指正!一、文件准备:https://qnsc.oss-cn-beijing.aliyuncs.com/crmebimage/public/product/2024/11/12/be35321......
  • springboot起步依赖原理
    起步依赖原理分析1)spring-boot-starter-parent找到spring-boot-starter-parent并进入可以看到spring-boot-dependencies依赖关系再次进入通过properties来定义了各种技术的版本信息版本锁定指我们在父工程中定义好的一些坐标和他需要的版本信息,后续如果继承这个工程的话......
  • 拒绝平铺直叙,阿里最新SpringBoot进阶笔记真香
    相信从事Java开发的朋友都听说过SSM框架,老点的甚至经历过SSH,说起来有点恐怖,比如我就是经历过SSH那个时代未流。当然无论是SSM还是SSH都不是今天的重点,今天要说的是SpringBoot,一个令人眼前一亮的框架,从大的说,SpringBoot是取代了SSM中的SS的角色。但值得一说的是,SpringBoot这......
  • 基于java+springboot+layui的流浪动物交流信息平台设计实现
    基于java+springboot+layui的流浪动物交流信息平台设计实现......
  • kafka(启动集群,使用spring方法,自定义配置)
    ApacheKafka是一个开源的分布式流处理平台,最初由LinkedIn开发,后来成为Apache项目。Kafka主要用于高吞吐量、低延迟的实时数据流处理,常用于日志收集、实时分析、消息传递等场景。以下是关于Kafka的详细讲解:一、理论知识1.Kafka的基本概念Kafka是一个分布式的......