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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在Spring Boot中,starter是一种特殊的依赖,帮助开发人员快速引入和配置特定功能模块。自定义starter可以封装一组特定功能的依赖和配置,简化项目中的功能引入。其主要优点包括模块化、简化配置、提高代码复用性和实现特定功能。常见的应用场景有短信发送模块、AOP日志切面、分布式ID生成等。通过创建autoconfigure和starter两个Maven工程,并编写自动配置类及必要的配置文件,可以实现一个自定义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工程

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
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }
    // MapperScannerConfigurer
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory) {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        // 扫描的包:启动类所在的包及其子包
        List<String> packages = AutoConfigurationPackages.get(beanFactory); // 获取启动类所在的包名
        String basePackage = packages.get(0);   // 因为启动类所在的包只有一个,直接获取第一个
        mapperScannerConfigurer.setBasePackage(basePackage);    // 设置mapper的包扫描路径
        // 扫描的注解:@Mapper
        mapperScannerConfigurer.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.Driver
    url: jdbc:mysql://localhost:3306/mybatis
    username: root
    password: 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需要的配置操作,再进行一次封装。用户就可以省去配置的过程,做到引入就自动配置。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
5月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
130 0
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
497 37
|
2月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
197 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
5月前
|
Android开发
Android面试题之自定义View注意事项
在Android开发中,自定义View主要分为四类:直接继承View重写onDraw,继承ViewGroup创建布局,扩展特定View如TextView,以及继承特定ViewGroup。实现时需注意:支持wrap_content通过onMeasure处理,支持padding需在onDraw或onMeasure/onLayout中处理。避免在View中使用Handler,使用post系列方法代替。记得在onDetachedFromWindow时停止线程和动画以防止内存泄漏。处理滑动嵌套时解决滑动冲突,并避免在onDraw中大量创建临时对象。
66 4
32SpringBoot自定义Starter
32SpringBoot自定义Starter
62 0
32SpringBoot自定义Starter
|
7月前
|
设计模式 Java 机器人
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
|
6月前
|
IDE Java Maven
SpringBoot自定义starter及自动配置
SpringBoot自定义starter及自动配置