【SpringBoot】SpringBoot Starter 作用及原理

news2024/11/17 11:28:38

文章目录

  • 前言
  • 一、什么是 Starter
  • 二、Starter 的作用
  • 三、spring 整合组件
  • 四、spring-boot 整合组件
  • 五、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 的。大概有以下几个步骤:

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

相关依赖

<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 的。大概有以下几个步骤:

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

引入 mybatis-spring-boot-starter 依赖

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

application.properties 文件中添加相关配置。

 spring.datasource.username=x********
 spring.datasource.password=********
 spring.datasource.url=********
 spring.datasource.driver-class-name=********


 ​
 mybatis.mapper-locations=classpath:mapper/*.xml

编写 xxxMapper.xml 及 xxMapper.java 文件

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

业务编码调用

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

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

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

五、Starter 原理

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

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

在这里插入图片描述

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

在这里插入图片描述

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

  1. 发现存在的 DataSource 并注入配置。
    在这里插入图片描述

  2. 注册 SqlSessionFactory、SqlSessionTemplate 到 Spring 容器中。
    在这里插入图片描述

  3. 内部类 AutoConfiguredMapperScannerRegistrar 扫描存在 @Mapper 注解类转化为 BeanDefinition 并注册到 Spring 容器中。
    在这里插入图片描述

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

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

相关文章

服务注册中心Eureka

服务注册中心Eureka Eureka介绍Eureka 环境搭建Eureka 集群配置Eureka 的自我保护模式Eureka 架构图 Eureka介绍 在微服务架构中&#xff0c;有着许许多多的微服务&#xff0c;微服务之间需要彼此进行远程调用&#xff0c;需要知道彼此的地址&#xff0c;通过人工的方式去管理…

C++算法:加权连通图的最小生成树(Prim)

文章目录 前言一、Prim算法原理二、算法实现1、生成图2、Prim 总结原创文章&#xff0c;未经许可&#xff0c;严禁转载 前言 在前文加权连通图的最小生成树(Kruskal)中已经用以边找点的方式实现最小生成树的生成。Prim算法也是一种常用的最小生成树算法&#xff0c;和Kruskal不…

python 妙笔生花

1.学习编程好处 最主要的好处就是,思考问题的方式变得更加具有逻辑性。 日常我们敲代码时,需要思考每一行的代码执行效果,它就需要认真设计每行代码可用性。如果在设计上发生错误,在代码执行时就会报错。还能做到 触类旁通。 古语有云: 有道无术,术可求,有术无道,止于术…

armbian可视化查看系统的使用情况

文章目录 armbian查看系统的使用情况在终端可视化查看方式htop简介htop安装和使用的步骤 在浏览器可视化查看方式 armbian查看系统的使用情况 在终端可视化查看方式 htop简介 htop’是一款任务管理器和系统监视工具&#xff0c;可在Armbian Linux中使用。它提供了比默认任务…

Python使用多线程操作tif影像和HBase数据库

本文介绍使用Python的多线程技术&#xff0c;提高happybase模块和gdal模块的效率&#xff0c;从tif格式的影像文件中读取数据&#xff0c;并将其存储到HBase数据库中。主要步骤包括&#xff1a; 准备工作&#xff1a;安装Python环境&#xff0c;安装happybase模块和gdal模块&a…

windows安装jdk1.8

1.下载jdk8 https://www.oracle.com/java/technologies/downloads/#java8-windows 百度网盘&#xff1a; 链接: https://pan.baidu.com/s/1qtVZ3Rsa1_n9XsFcXj07rA 提取码: yhwc 2.双击以后进行JDK的安装 操作前先在D盘保存java文件夹&#xff0c;里面新建jdk1.8.0_241文件…

AntDB 替换某省电信大数据平台的案例分享

亚信自研分布式数据库AntDB落地某省电信的案例分享 整体介绍 某省电信大数据分析平台&#xff0c;需要对BSS的三户、订单、实例等近10TB级的数据进行快速分析统计&#xff0c;每次分析的数据量最高达到5亿级别&#xff0c;同时需要向其它厂商开放这种实时的数据分析能力&…

Java-API简析_java.util.Currency类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131255544 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

对象实例化空指针处理

1 问题 如何解决对象实例化空指针异常&#xff1f; 2 方法 首先创建一个package包&#xff0c;将其Menu类及相关代码放入其中&#xff0c;并在该package包下创建另一个类MenuItem&#xff0c;然后通过构造函数&#xff0c;写入需要运行的对象信息&#xff0c;最后在Menu类中用n…

leetcode 151. 反转字符串中的单词

2023.6.14 这道题全面考察了字符串的一些操作&#xff0c;这里我的思路是&#xff1a; 先对字符串进行空格去除操作&#xff0c;这里要注意一个细节&#xff1a;先用for循环去除连续空格&#xff0c;再用if判断开头和结尾的空格。再对没有异常空格的s 做一个反转操作。再对每一…

计算机网络基础知识(九)—— 什么是TelnetS?Telnet Over TLS

文章目录 01 | TelnetS02 | OpenSSL03 | 实现思路服务器处理流程客户端处理流程 04 | 代码实现服务端代码客户端代码编译过程 & 执行结果 前面学习了什么是HTTPS协议&#xff0c;了解了HTTPS的工作原理以及具体的工作流程&#xff0c;了解了HTTP协议和HTTPS协议之间的区别。…

SSM框架搭建

SSM环境搭建 1 IDE的话&#xff0c;我用的MyEcplise&#xff0c;如果用Ecplise的话&#xff0c;需要自行配置服务器。 首先&#xff0c;建一个Dynamic工程&#xff0c;需要注意的是一定要勾选上web.xml。 将Spring框架包、jstl包、standard包、common-logging包、aopallian…

系列十三、MongoDB聚合查询

一、概述 MongoDB聚合框架&#xff08;Aggregation Framework&#xff09;是一个计算框架&#xff0c;它可以&#xff1a; ①&#xff1a;作用在一个或者几个集合上; ②&#xff1a;对集合中的数据进行一系列的运算; ③&#xff1a;将这些数据转化为期望的形式; 从效果而言…

AIGC技术研究与应用 ---- 下一代人工智能:新范式!新生产力!(5 - AIGC 未来展望)

文章大纲 不可避免的职业替代AI 对人类思维的影响AIGC 的风险人工智能对齐 -- 价值学习 鲁棒适应参考文献与学习路径GPT 系列模型解析前序文章模型进化券商研报陆奇演讲多模态据预测,未来五年10%-30%的图片内容由AI参与生成,考虑到下一代互联网对内容需求的迅速提升,2030年A…

计算机网络管理 实验4(一) SNMP报文分析之验证SNMP协议的工作过程以及分析SNMP数据单元的格式

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

FPGA基础知识-门级建模

目录 学习目标 学习内容 1.门的类型 2.门延迟 学习时间 学习小结 学习目标 学习Verilog 提供的门级原语 理解门的实例引用、门的符号以及andor&#xff0c;bufnot类型的门的真值表 学习如何根据电路的逻辑图来生成verilog描述 讲述门级设计中的上升、下降和关断延迟 …

【论文解读系列】Blip-2:引导语言图像预训练具有冻结图像编码器和大型语言模型

Blip-2 BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models BLIP-2&#xff1a;引导语言图像预训练具有冻结图像编码器和大型语言模型 (0) 总结&实测 总结&#xff1a;blip-2 最大的贡献在于&#xff0c;提出了…

跨境电商社交媒体:选择合适的平台

正如您在使用社交媒体的九种方法中了解到的那样&#xff0c;跨境电商优先考虑社交媒体营销可能会更有利可图。有数十个平台可供选择&#xff0c;每个平台都迎合了具有不同兴趣、特征和位置的独特受众。 那么您应该关注哪个社交媒体平台以及如何以最大效率工作&#xff1f; 目…

【Vue全家桶高仿小米商城】——(三)VueCli4.0安装和使用

文章目录 第三章&#xff1a;VueCli4.0安装和使用一、VueCli4.0安装&#xff1a;二、创建Vue项目方式一 使用脚本搭建方式二 使用UI界面搭建 三、安装依赖方式一 Vue脚手架图形界面安装方式二、命令行安装 四、Vue DevTools安装使用两种安装方式&#xff1a; 第三章&#xff1a…

Linux权限解析

一、Linux用户分类 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xff0c;普通用户的…