详解SpringBoot Starter作用及原理

 更新时间:2023年04月21日 09:21:00   作者:叫我二蛋  
大家都知道基于 SpringBoot 开发项目可以简化 Spring 应用的搭建以及开发过程,提高程序员开发效率,这是由于其“约定大约配置”的策略及其自动装配的特点,Starter 就是自动装配的具体实现,本文详细介绍了SpringBoot Starter作用及原理,欢迎大家来阅读学习

前言

有没有在入行后直接基于 SpringBoot 开发项目,没有 spring、servlet 开发经历的,举个手😄。

有没有用 SpringBoot 开发项目,但是第一次听说 Starter 或者听过却不知道是干嘛的,举个手😄。

有没有知道 Starter 是干嘛的,但不知其原理的,举个手😄。

有没有想了解 Starter 原理或想自己实现一个 Starter 提供别人使用的,举个手😄。

如果有以上情况的,希望通过本文可以帮助你了解 Starter 。

什么是 Starter

大家都知道基于 SpringBoot 开发项目可以简化 Spring 应用的搭建以及开发过程,提高程序员开发效率,这是由于其“约定大约配置”的策略及其自动装配的特点。

约定大约配置是指 SpringBoot 指定了特定的方式进行配置(application.properties/yam/yaml),开发人员不需要像在 Spring 框架开发时定义配置文件。

自动装配是指在使用某个组件或框架时需要引用其依赖、配置类、配置文件等工作时,SpringBoot 帮我们做了这些工作。

那跟 Starter 有关系吗?答案是:有! Starter 就是自动装配的具体实现,其就是一个 maven 项目,对某个组件的依赖、配置进行管理。通过导入 “Starter” 模块更容易使用这个组件。

Starter 的作用

我们通过对比 mybatis-spring 和 mybatis-spring-boot-starter 代码示例,了解 Starter 的作用。

spring 整合组件

先看下在 spring 项目中如何使用 mybatis 的。大概有以下几个步骤:

  • 引入 spring、mybatis、jdbc 等相关依赖。
  • 创建 mybatis-config.xml 配置文件。
    • 声明数据源 DataSource。
    • 声明 SqlSessionFactoryBean。
    • 声明 MapperScannerConfigurer。
    • 声明等等配置。
  • 编写 xxxMapper.xml 及 xxMapper.java 文件。
  • 业务编码调用。

相关依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.1</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.0</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.9</version>
</dependency>
<dependency>
  <groupId>xxx</groupId>
  <artifactId>xxxx</artifactId>
  <version>xxx</version>
</dependency>
...

mybatis-config.xml 配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <context:property-placeholder location="classpath:jdbc.properties"/>
   
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
 
    <mappers>
        <package name="com.xxx.dao"/>
    </mappers>
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:xxxx/*.xml"/>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xxx.dao"/>
    </bean>

    <bean class=".xxxxxx.xxx">
        <!-- 指定SqlSessionFactory对象的名称 -->
        <property name="sqlSessionFactoryBeanName" value="factory"/>
        <!-- 指定基本包,dao接口所在的包名 -->
        <property name="basePackage" value="com.xxx.dao"/>
    </bean>

    <bean class=".xxxxxx.xxx">
         ...
    </bean>
 
    
</configuration>

业务编码调用

@Autowired
private XxxDao xxxDao;
         
xxxDao.insert(xx);

作为一个开发人员是否觉得很麻烦?答案一定是的,如果稍不留神少了哪个配置或依赖,那就排查问题吧😄。

spring-boot 整合组件

这时候我们如果用基于 SpringBoot 开发,那 mybatis-spring-boot-starter 就可以帮助我们做这些事。

那我们继续看下在 SpringBoot 项目中如何使用 Mybatis 的。大概有以下几个步骤:

  • 引入 mybatis-spring-boot-starter 依赖。
  • application.properties 文件中添加相关配置。
  • 编写 xxxMapper.xml 及 xxMapper.java 文件。
  • 业务编码调用。

引入 mybatis-spring-boot-starter 依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

编写 xxxMapper.xml 及 xxMapper.java 文件

@Mapper
 public interface XXXMapper {
     List<XXX> list(xxx);
 }

通过以上的代码比较可以明显的感觉到利用 Starter 后,我们编写的代码更少了,特别是 1、2 步骤,这就是 Starter 的作用。 mybatis-spring-boot-starter 帮助我们做了以下几件事:

  • 整合了组件相关的依赖,使我们直接引入 mybatis-spring-boot-starter 依赖即可,也避免了版本冲突问题。
  • 自动发现存在的 DataSource,做到自动配置。
  • 帮我们创建并注册SqlSessionFactory、SqlSessionTemplate等,减少了配置类、配置项。
  • 自动扫描映射器(Mapper),注入到 Spring Bean 中。

Starter 原理

那 mybatis-spring-boot-starter 是如何做这些事的,我们扒开裤子看个究竟😄。

首先看 mybatis-spring-boot-starter 项目结构,其只有一个pom.xml文件,文件中已经帮我们引入相关依赖,跟上面 Spring 整合 Mybatis 的依赖是不是差不多。

其中有一个 mybatis-spring-boot-autoconfigure 依赖,我们看下其项目结构

其通过 SPI 机制引入了 MybatisAutoConfiguration 配置类,该类帮我们做了以下几件事:

注册 SqlSessionFactorySqlSessionTemplate 到 Spring 容器中。

内部类 AutoConfiguredMapperScannerRegistrar 扫描存在 @Mapper 注解类转化为 BeanDefinition 并注册到 Spring 容器中。

到此这篇关于详解SpringBoot Starter作用及原理的文章就介绍到这了,更多相关SpringBoot Starter作用及原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 快速解决SpringMVC @RequestBody 用map接收请求参数的问题

    快速解决SpringMVC @RequestBody 用map接收请求参数的问题

    今天小编就为大家分享快速解决SpringMVC @RequestBody 用map接收请求参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Spring6当中获取Bean的四种方式小结

    Spring6当中获取Bean的四种方式小结

    Spring 为Bean 的获取提供了多种方式,通常包括4种方式,(也就是说在Spring中为Bean对象的创建准备了多种方案,目的是:更加灵活),本文将通过代码示例详细的给大家介绍了一下这四种方式,需要的朋友可以参考下
    2024-04-04
  • 详解Java中的不可变对象

    详解Java中的不可变对象

    这篇文章主要介绍了Java中的不可变对象的相关知识,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以参考下
    2020-06-06
  • springboot 设置局域网访问的实现步骤

    springboot 设置局域网访问的实现步骤

    Spring Boot是一个开源Java-based框架,用于创建独立的、生产级别的Spring应用,它旨在简化Spring应用的初始搭建及开发过程,通过提供各种自动配置的starter包,Spring Boot使得项目配置变得简单快速,感兴趣的朋友一起看看吧
    2024-02-02
  • 使用Spring特性实现接口多实现类的动态调用方式

    使用Spring特性实现接口多实现类的动态调用方式

    这篇文章主要介绍了使用Spring特性实现接口多实现类的动态调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot使用log4j2将日志记录到文件及自定义数据库的配置方法

    SpringBoot使用log4j2将日志记录到文件及自定义数据库的配置方法

    这篇文章主要介绍了SpringBoot使用log4j2将日志记录到文件及自定义数据库的配置方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • Elasticsearch 在 Java 中的使用教程

    Elasticsearch 在 Java 中的使用教程

    Elasticsearch 是一个分布式搜索和分析引擎,基于 Apache Lucene 构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文搜索、日志分析、性能监控等领域,本文给大家介绍Elasticsearch 在 Java 中的使用教程,感兴趣的朋友一起看看吧
    2025-04-04
  • 详解MongoDB和Spring整合的实例代码

    详解MongoDB和Spring整合的实例代码

    这篇文章主要介绍了详解MongoDB和Spring整合的实例代码,Spring提供了MongoTemplate这样一个模板类的实现方法,简化了具体操作。有兴趣的可以了解一下
    2017-07-07
  • Java 三种进制的数值常量操作

    Java 三种进制的数值常量操作

    这篇文章主要介绍了Java 三种进制的数值常量操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • IDEA新UI如何移动类路径工具栏到顶部

    IDEA新UI如何移动类路径工具栏到顶部

    文章介绍了IDEA更新新UI后,类路径工具栏放到底部的问题,并提供了解决方案,此外,还提到了如何关闭主菜单背景色的方法
    2025-01-01

最新评论