
强烈推荐:最全的java面试题库
本文会以 mybatis 为例,通过对比 mybatis-spring
和 mybatis-spring-boot-starter
代码示例,了解 Starter 的作用。并对 mybatis-spring-boot-starter
进行简单剖析,了解 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>
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
帮助我们做了以下几件事:
-
整合了组件相关的依赖,使我们直接引入 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
配置类,该类帮我们做了以下几件事:
1.发现存在的 DataSource 并注入配置。

2.注册 SqlSessionFactory
、SqlSessionTemplate
到 Spring 容器中。

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

感谢阅读,希望对你有所帮助 :) 来源:wangbinguang.blog.csdn.net/article/ details/130270365
后端专属技术群 构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以
交流技术
、职位内推
、行业探讨
为主广告人士勿入,切勿轻信私聊,防止被骗
加我好友,拉你进群 原文始发于微信公众号(Java面试题精选):SpringBoot Starter 作用及原理,你真的清楚吗?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/141947.html