最新版 | SpringBoot3如何自定义starter(面试常考)

文章目录

  • 一、自定义starter介绍
  • 二、自定义Starter的好处及优势
  • 三、自定义starter应用场景
  • 四、自定义starter
    • 1、创建autoconfigure的maven工程
    • 2、创建starter的maven工程
    • 3、在autoconfigure的pom文件中引入MyBatis的所需依赖
    • 4、编写自动配置类MyBatisAutoConfiguration
    • 5、编写imports配置文件
    • 6、在starter的pom文件中引入autoconfigure的文件
    • 7、测试自定义starter是否生效


在学习自定义starter前,需要先了解SpringBoot自动配置原理。学习完SpringBoot自动配置原理以后,我们来自己制作一个starter。

一、自定义starter介绍

在Spring Boot中,starter是一种特殊的依赖,它可以帮助开发人员快速引入和配置某个特定的功能模块。

Spring Boot的官方starter并不一定包含所有开发人员所需的功能,这时候就需要自定义starter来满足特定项目的需求。

自定义starter是一种自包含的、可重用的模块,它封装了一组特定功能的依赖和配置,并提供了简化配置的方式。通过自定义starter,开发人员可以将一些常用的功能封装起来,使得在其他项目中引入这些功能变得更加简单和方便。


二、自定义Starter的好处及优势

特点及优势说明
模块化自定义Starter可以将特定的功能模块化,使得开发人员可以更方便地管理和维护代码。
简化配置通过自定义Starter,开发人员可以简化配置,减少重复的配置工作,提高开发效率。
提高代码重用性自定义Starter可以封装一组特定功能的依赖和配置,使得在其他项目中引入这些功能变得更加简单和方便,从而提高代码重用性。
自定义功能如果Spring Boot的官方Starter不能满足项目的需求,那么自定义Starter就可以发挥重要作用。开发人员可以根据项目需求自定义Starter,从而实现一些特定的功能。

三、自定义starter应用场景

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

  • 常见的应用场景:

1)通用模块-短信发送模块

2)基于AOP技术实现日志切面

3)分布式雪花ID,Long转String,解决精度问题

4)微服务项目的数据库连接池配置

5)微服务项目的每个模块都要访问redis数据库,每个模块都要配置redisTemplate


四、自定义starter

我们可以先参考一下MyBatis的starter,一般情况下起步依赖会由两个工程组成,一个是xxx-autoconfigure提供自动配置功能,另一个是xxx-starter提供依赖管理功能。同时会在starter中引入autoconfigure,将来使用者引入starter就可以了。

了解了自定义starter的套路后,我们来自定义一个MyBatis的starter。

1、创建autoconfigure的maven工程

创建一个maven工程,名字叫做dmybatis-spring-boot-autoconfigure,前面加d是为了和MyBatis官方的起步依赖区分开。

注意命名规范:springboot官方提供的starter一般以spring-boot-starter-xxxx方式命名,官方建议自定义的starter使用xxxx-spring-boot-starter命名。用来区分第三方的starter和springboot官方的starter。

2、创建starter的maven工程

再创建一个maven工程,名字叫做dmybatis-spring-boot-starter。

3、在autoconfigure的pom文件中引入MyBatis的所需依赖

首先我们观察一下MyBatis的官方起步依赖包含哪些子依赖:

  • org.springframework.boot:spring-boot-starter:3.3.3
  • org.springframework.boot:spring-boot-starter-jdbc:3.3.3
  • org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:3.0.3
  • org.mybatis:mybatis:3.5.14
  • org.mybatis:mybatis-spring:3.0.3

其中org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:3.0.3依赖我们不需要引入,因为autoconfigure模块由我们自定义。只需在autoconfigure的pom文件中引入其他的依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.3.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>3.3.3</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.14</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency>
</dependencies>

4、编写自动配置类MyBatisAutoConfiguration

@AutoConfiguration  // 表识当前类是一个自动配置类
public class MyBatisAutoConfiguration {// SqlSessionFactoryBean@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}// MapperScannerConfigurer@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory) {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();// 扫描的包:启动类所在的包及其子包List<String> packages = AutoConfigurationPackages.get(beanFactory); // 获取启动类所在的包名String basePackage = packages.get(0);   // 因为启动类所在的包只有一个,直接获取第一个mapperScannerConfigurer.setBasePackage(basePackage);    // 设置mapper的包扫描路径// 扫描的注解:@MappermapperScannerConfigurer.setAnnotationClass(Mapper.class);return mapperScannerConfigurer;}
}

5、编写imports配置文件

在autoconfigure项目的/resources/META-INF/spring目录下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports配置文件,注意存放路径要严格遵循这个文件夹名和文件名,SpringBoot才会识别到配置文件。

在imports文件中,我们只需要填写MyBatis的自动配置类的全类名即可:

com.aizen.config.MyBatisAutoConfiguration

6、在starter的pom文件中引入autoconfigure的文件

<dependencies><dependency><groupId>com.aizen</groupId><artifactId>dmybatis-spring-boot-autoconfigure</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>

7、测试自定义starter是否生效

在springboot-mybatis项目中,已经配置了datasource数据源,并写好了后端数据访问接口。

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisusername: rootpassword: root
@Mapper
public interface UserMapper {@Select("select * from user where id = #{id}")User findById(Integer id);
}

在项目的pom文件中引入自定义MyBatis的starter依赖:

<!-- 自定义的mybatis起步依赖 -->
<dependency><groupId>com.aizen</groupId><artifactId>dmybatis-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version>
</dependency><!--mysql驱动依赖-->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId>
</dependency>

通过postman测试请求接口,成功查询到数据,说明自定义starter已经生效!

从提供的MyBatis自定义starter结构可以看出,starter就是一个普通的maven项目,引入了需要配置的模块后,帮用户写好接入Spring需要的配置操作,再进行一次封装。用户就可以省去配置的过程,做到引入就自动配置。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pdf文件编辑器有哪些?分享适合新手用的5个PDF编辑器(解锁教程)

pdf是一种通用文件格式&#xff0c;也是一种夸操作系统平台的文件格式。 好用的PDF文件编辑器可以让您更改和添加文本、编辑图像、添加图形、签署签名、填写表单数据等。下面整理了关于pdf文件编辑方法介绍&#xff0c;以及一些好用的pdf编辑器&#xff0c;有需要的可以了解下…

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中&#xff0c;如果我们不需要使用默认边框设计自己个性化的窗体&#xff08;FromBorderStylenone时&#…

LEAN 类型理论之注解(Annotations of LEAN Type Theory)-- 商类型(Quotient Type)

商类型&#xff08;Quotient Type&#xff09;&#xff0c;也称划分类型&#xff0c;通过给定义一个定义在某一类型 α 上的关系R&#xff1a;α → α→ ℙ&#xff0c;将类型α 中&#xff0c;满足关系R的元素摘出来&#xff0c;组成该商类型&#xff08;Quotient&#xff09…

2024国赛数学建模C题完整论文:农作物的种植策略

农作物种植策略优化的数学建模研究&#xff08;完整论文&#xff0c;持续更新&#xff0c;大家持续关注&#xff0c;更新见文末名片 &#xff09; 摘要 在本文中&#xff0c;建立了基于整数规划、动态规划、马尔科夫决策过程、不确定性建模、多目标优化、相关性分析、蒙特卡洛…

20:HAL--RNG

一&#xff1a;RNG 伪随机数就是rand函数产生的数。 F1系列的没有RNG,使用本次说的都是F407的&#xff0c;我使用的是STM32F407VET6 B&#xff1a;框架 C&#xff1a;寄存器 /*RNG_SR寄存器的DRDY位*/ while ((__HAL_RNG_GET_FLAG(&rng_handle, RNG_FLAG_DRDY) RESET) …

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说&#xff0c;类似于 calcHist&#xff0c;在每个位置 (x, y)…

PostgreSQL的repmgr工具介绍

PostgreSQL的repmgr工具介绍 repmgr&#xff08;Replication Manager&#xff09;是一个专为 PostgreSQL 设计的开源工具&#xff0c;用于管理和监控 PostgreSQL 的流复制及实现高可用性。它提供了一组工具和实用程序&#xff0c;简化了 PostgreSQL 复制集群的配置、维护和故障…

CSS解析:定位和层叠上下文

许多开发人员对定位的理解很粗略&#xff0c;如果不完全了解定位&#xff0c;就很容易给自己挖坑。有时候可能会把错误的元素放在其他元素前面&#xff0c;要解决这个问题却没有那么简单。 一般的布局方法是用各种操作来控制文档流的行为。定位则不同&#xff1a;它将元素彻底…

虚幻地形高度图生成及测试

虚幻地形高度图生成及测试 虚幻引擎地形系统将高度数据存储在高度图中&#xff0c;这是一个灰阶图像&#xff0c;使用黑白色值来存储地貌高程。在高度图中&#xff0c;纯黑色值表示最低点&#xff0c;纯白色值表示最高点。支持16位灰阶PNG、8位灰阶r8及16位灰阶r16格式。 本文…

硬刚苹果还得是华为

文&#xff5c;琥珀食酒社 作者 | 璇子 牛皮啊 华为发三折叠不意外 意外的是 这各种翻转简直颠覆想象 市面上没见过这么能“翻转”的&#xff1f; 要不怎么说硬刚苹果 还得看华为 就跟你同天怎么了&#xff1f; 拼创新、拼技术、拼热度 你就说哪比你差吧&#xff1f…

基于VUE的校园二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于VUE的校园二手物品交易管理系统8拥有两种角色 管理员&#xff1a;闲置物品管理、订单管理、用户管理 用户&#xff1a;登录注册、购物车、发布闲置物品、评论、发货、收货地址管理等…

电力设计院10大排行榜!这个大院屠榜!

今天晚上阅读了中国电力规划设计协会《2022年度电力勘测设计行业统计分析报告》&#xff0c;这本报告是依据协会会员企业统计报表数据进行编制分析的。报告共收集了167家勘测设计企业上报的数据信息&#xff0c;统计的企业数量较2021 年166家企业增加1 家。 按业务板块划分为&…

element ui form 表单出现英文提示的解决方案

场景再现&#xff1a; 在使用 form 表单的时候&#xff0c;一般都需要对表单元素进行验证&#xff0c;错误就出现在了这里&#xff0c;除了配置的错误信息&#xff0c;还会出现一个 英文校验提示&#xff0c;如下图&#xff1a; 解决方案 出现的原因是在el-form-item中使用…

Tensorflow2 如何扩展现有数据集(缩放、随机旋转、水平翻转、平移等),从而提高模型的准确率 -- Tensorflow自学笔记14

实际生活中的数据集&#xff0c;往往不是标准的数据&#xff0c;而是有倾斜角度、有旋转、有偏移的数据&#xff0c;为了提高数据集的真实性&#xff0c;提高模型预测的准确率&#xff0c;可以用ImageDataGenerator函数来扩展数据集 import tensorflow as tffrom tensorflow.k…

(二)ASP.NET Core WebAPI项目的启动地址设置

上一篇介绍了ASP.NET Core WebAPI项目创建&#xff0c;可参考&#xff1a; 1.webAPI的访问地址 1) 启动时&#xff0c;选择CoreWebAPI(项目名称)运行项目 可以看到打开浏览器后的地址是&#xff1a;applicationUrl"\"launchUrl 2) 启动时&#xff0c;选择IIS Expre…

Ansys Zemax | 在OpticStudio中仿真单模光纤耦合

附件下载 联系工作人员获取附件 准确分析耦合效率在光纤耦合系统的设计中至关重要。本文演示了如何在OpticStudio中使用多种光纤耦合效率分析。 概要 OpticStudio序列模式可以很好地模拟单模光纤耦合效率。本文演示了如何设置耦合系统&#xff0c;并研究了序列模式下可用于…

redis分布式锁和lua脚本

业务场景&#xff1a;多个线程对共同资源的访问&#xff1a;库存超卖/用户重复下单的原因 解决方法一&#xff1a;利用jvm内置锁&#xff0c;将非原子性操作变成原子性操作 Synchronized锁的是对象&#xff0c;对象必须是单例的。锁的是this,代表当前所在的类&#xff0c;这个…

RabbitMQ 基础架构流程 数据隔离 创建用户

介绍 publisher&#xff1a;消息发送者-exchange&#xff1a;交换机&#xff0c;复制路由的消息-queue&#xff1a;队列&#xff0c;存储消息consumer&#xff1a;消息的消费者 工作流程 publisher消息发送者 -> exchange 交换机 -> queue 队列 -> consumer 消息的消…

流动会场:以声学专利为核心的完美移动场地—轻空间

流动会场作为一种全新的活动场所选择&#xff0c;凭借其便捷的移动性与先进的声学设计&#xff0c;正逐渐成为各类演出、会议和文化活动的热门场地。其独特之处不仅在于搭建速度快、灵活性高&#xff0c;还在于其核心技术——声学专利的强大支持。 专利声学设计&#xff0c;打造…

【LeetCode】06.Z字形变换

题目要求 解题思路 首先映入我们脑海的就是暴力。这一方法可行&#xff0c;但是时间复杂度空间复杂度很高&#xff0c;因此我们使用找规律的方法。这样的话我们可以模拟插入下标&#xff0c;这样的话很容易发现首行和末行插入的位置刚好是d2*n-2&#xff0c;而中间行的两个位置…