当前位置: 代码网 > it编程>编程语言>Java > Spring Boot 集成 mybatis核心机制

Spring Boot 集成 mybatis核心机制

2025年11月26日 Java 我要评论
spring boot浅析spring boot 并不是对 spring 框架的替代,而是对 spring 的“自动配置”和“快速启动”的封装与增强。1

spring boot浅析

spring boot 并不是对 spring 框架的替代,而是对 spring 的“自动配置”和“快速启动”的封装与增强。

1.依赖管理(starter poms)

spring boot 提供了一系列 spring-boot-starter-* 依赖,这些 starter 内部已经预定义了常用 spring 模块(如 spring core、spring context、spring web、spring data 等)的兼容版本。

例如:

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
</dependency>

这个 starter 自动引入了:

  • spring mvc(用于 web 开发)
  • spring core / context(ioc 容器)
  • jackson(json 处理)
  • tomcat(内嵌 web 容器)
  • 其他 web 相关依赖

这样开发者无需手动管理大量依赖及其版本。

2.自动配置(autoconfiguration)

spring boot 通过 @enableautoconfiguration(通常由 @springbootapplication 启用)扫描 classpath 中存在的类,自动配置 spring 应用上下文。

例如:

  • 如果 classpath 中有 dispatcherservlet(来自 spring web),spring boot 会自动配置一个基于 spring mvc 的 web 应用。
  • 如果检测到 hikaricp 和 mysql 驱动,会自动配置数据源。

这一切都建立在 spring 的条件化配置(@conditional)机制之上,是 spring framework 本身提供的能力。

3.内嵌容器支持

spring boot 内置了 tomcat、jetty 或 undertow,使得 web 应用可以独立运行(jar 包直接启动),而不需要部署到外部 servlet 容器。但底层处理 http 请求、路由、拦截器等,依然依赖 spring mvc

4.spring boot = spring + 约定优于配置 + 快速启动工具

本质上,spring boot 是 spring 生态的“脚手架”,它让开发者能以最少的配置快速构建生产级应用,但核心功能(ioc、aop、事务、web 层等)仍然由 spring framework 提供。

  • 对于 web 应用(尤其是 rest api 或传统 web 项目),spring boot 默认使用 spring mvc 作为 web 层框架,因此很多人感觉“spring boot = spring mvc”。
  • spring-boot-starter-web 默认引入 spring mvc,并自动配置 dispatcherservlet、视图解析器、消息转换器等,使得 web 开发极其便捷。

❌ 误解澄清:

  • spring boot 不仅限于 web 应用。你也可以构建:
  • 命令行应用(无 web)
  • 消息驱动应用(如集成 kafka、rabbitmq)
  • 批处理应用(配合 spring batch)
  • 响应式应用(使用 webflux 而非 mvc)
  • 在这些场景中,spring mvc 根本不会被使用。例如:
@springbootapplication
public class batchapplication {
    public static void main(string[] args) {
        springapplication.run(batchapplication.class, args);
    }
}
  • 这个应用可能只用到 spring core、spring batch,完全不涉及 mvc。

📌 更准确的说法:

spring boot 的核心是 spring framework,而 spring mvc 是其在构建 web 应用时默认采用的 web 层实现。

核心机制:starter + autoconfiguration

1.starter 依赖(约定优于配置)

spring boot 提供了一系列 spring-boot-starter-* 依赖,每个 starter 封装了某个功能领域所需的全部依赖。

例如:

<!-- web 应用 -->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!-- 数据访问(jpa) -->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-data-jpa</artifactid>
</dependency>
<!-- 安全控制 -->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-security</artifactid>
</dependency>

这些 starter 内部已经:

  • 引入了对应的 spring 模块(如 spring-webmvcspring-data-jpaspring-security-web
  • 设置了兼容的版本(通过 spring-boot-dependencies 管理)
  • 包含了自动配置类(位于 meta-inf/spring/org.springframework.boot.autoconfigure.autoconfiguration.imports

2.自动配置(autoconfiguration)

spring boot 在启动时(通过 @enableautoconfiguration)会扫描所有 starter 中声明的自动配置类,并根据 条件注解(@conditional...) 决定是否启用。

示例:spring data jpa 的自动配置

当你引入 spring-boot-starter-data-jpa 后:

  • spring boot 检测到 classpath 中存在 entitymanager.class 和 datasource.class
  • 自动配置类 jparepositoriesautoconfiguration 被激活
  • 自动创建 entitymanagerfactorytransactionmanagerjparepository 实现等

你只需写:

public interface userrepository extends jparepository<user, long> {}

无需手动配置数据源、事务、实体管理器等。

条件化配置的关键注解:

  • @conditionalonclass:当 classpath 存在某类时生效
  • @conditionalonmissingbean:当容器中没有某 bean 时才创建
  • @conditionalonproperty:根据配置属性决定是否启用

常见 spring 模块集成示例

spring 模块starter 依赖自动配置效果
spring mvcspring-boot-starter-web自动配置 dispatcherservlet、内嵌 tomcat、消息转换器等
spring data jpaspring-boot-starter-data-jpa自动配置数据源、jpa、事务、repository 实现
spring securityspring-boot-starter-security自动启用安全过滤器链,默认登录页面、csrf 保护等
spring aopspring-boot-starter-aop自动启用基于代理的 aop(需配合 @enableaspectjautoproxy,但 boot 通常自动处理)
spring batchspring-boot-starter-batch自动配置 jobrepository、joblauncher、数据库 schema 初始化
spring cachespring-boot-starter-cache启用缓存抽象,配合 @enablecaching,可自动集成 caffeine/redis/ehcache
spring integrationspring-boot-starter-integration自动配置消息通道、适配器等

自定义集成:如何集成非官方或自研模块?

即使没有官方 starter,也可以手动集成 spring 模块:

步骤:

  1. 引入依赖(如第三方库或自定义 spring 组件)
  2. 编写自动配置类(可选)
  3. 在 application.properties 中提供配置项
  4. 使用 @import 或 @componentscan 加载配置

示例:手动集成 mybatis(虽有官方 starter,但演示原理)

@configuration
@conditionalonclass(sqlsessionfactory.class)
@enableconfigurationproperties(mybatisproperties.class)
public class mybatisautoconfig {
    @bean
    @conditionalonmissingbean
    public sqlsessionfactory sqlsessionfactory(datasource datasource) {
        // 手动构建 sqlsessionfactory
    }
}

然后在 resources/meta-inf/spring/org.springframework.boot.autoconfigure.autoconfiguration.imports 中注册该配置类,即可实现类似 starter 的效果。

手动集成步骤详解(无 starter)

✅ 目标

不使用 mybatis-spring-boot-starter,而是通过手动配置,让 mybatis 在 spring boot 中正常工作。

第 1 步:添加依赖

pom.xml 中引入必要依赖(注意:不引入 starter):

<!-- mybatis 核心 -->
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis</artifactid>
    <version>3.5.13</version>
</dependency>
<!-- mybatis 与 spring 集成桥接 -->
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis-spring</artifactid>
    <version>3.0.3</version>
</dependency>
<!-- 数据库驱动(以 h2 为例) -->
<dependency>
    <groupid>com.h2database</groupid>
    <artifactid>h2</artifactid>
    <scope>runtime</scope>
</dependency>
<!-- spring boot jdbc(提供 datasource 自动配置) -->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-jdbc</artifactid>
</dependency>

💡 注意:我们只用了 spring-boot-starter-jdbc 来让 spring boot 自动配置 datasource,但没有用 mybatis 的 starter。

第 2 步:配置数据源(application.yml)

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.driver
    username: sa
    password: ''

spring boot 会自动创建一个 datasource bean。

第 3 步:编写 mybatis 配置类(核心!)

这是手动集成的关键:用 java config 替代 xml 配置

@configuration
@mapperscan(basepackages = "com.example.demo.mapper") // 扫描 mapper 接口
public class mybatisconfig {
    @bean
    public sqlsessionfactory sqlsessionfactory(datasource datasource) throws exception {
        sqlsessionfactorybean factorybean = new sqlsessionfactorybean();
        factorybean.setdatasource(datasource);
        // 可选:设置 mybatis 全局配置(如驼峰映射)
        org.apache.ibatis.session.configuration configuration = new org.apache.ibatis.session.configuration();
        configuration.setmapunderscoretocamelcase(true);
        factorybean.setconfiguration(configuration);
        // 可选:注册 mapper xml 文件位置
        // factorybean.setmapperlocations(new pathmatchingresourcepatternresolver()
        //     .getresources("classpath:mapper/*.xml"));
        return factorybean.getobject();
    }
    @bean
    public platformtransactionmanager transactionmanager(datasource datasource) {
        return new datasourcetransactionmanager(datasource);
    }
}

关键点解析:

组件作用
@mapperscan等价于 xml 中的 <mybatis:scan />,自动为 @mapper 接口生成代理 bean
sqlsessionfactorybeanspring factorybean,用于创建 sqlsessionfactory
platformtransactionmanager启用 spring 管理的事务(配合 @transactional

⚠️ 注意:sqlsessionfactorybeanfactorybean<sqlsessionfactory>,调用 .getobject() 才得到真正的 sqlsessionfactory

第 4 步:编写 mapper 接口和实体类

// 实体类
public class user {
    private long id;
    private string name;
    // getter/setter
}
// mapper 接口
@mapper // 可省略,因为 @mapperscan 已覆盖
public interface usermapper {
    @select("select * from user where id = #{id}")
    user findbyid(long id);
    @insert("insert into user(name) values(#{name})")
    @options(usegeneratedkeys = true, keyproperty = "id")
    void insert(user user);
}

如果使用 xml 映射文件,需在 sqlsessionfactory 中通过 setmapperlocations() 指定路径。

第 5 步:在 service 中使用

@service
public class userservice {
    @autowired
    private usermapper usermapper;
    @transactional
    public void createuser(string name) {
        user user = new user();
        user.setname(name);
        usermapper.insert(user); // 自动生成 id
        system.out.println("inserted user id: " + user.getid());
    }
}

第 6 步:启动类

@springbootapplication
public class demoapplication {
    public static void main(string[] args) {
        springapplication.run(demoapplication.class, args);
    }
}

对比官方 starter 做了什么?

官方 mybatis-spring-boot-starter 实际上做了以下事情:

  1. 引入 mybatis + mybatis-spring
  2. 提供 mybatisproperties 类绑定 mybatis.* 配置项(如 mybatis.configuration.map-underscore-to-camel-case=true
  3. 提供自动配置类 mybatisautoconfiguration,内部逻辑几乎和我们上面写的 mybatisconfig 一致
  4. 自动处理 mapperscannerregistrar,支持 @mapperscan 或自动扫描带 @mapper 的接口

所以,手动集成 = 把 starter 的自动配置代码自己写一遍

到此这篇关于spring boot 集成 mybatis核心机制的文章就介绍到这了,更多相关spring boot 集成 mybatis内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com