SpringBoot 整合 SSM 全流程详解(含 JUnit+MyBatis 实战)(Spring系列18)

前言

SpringBoot作为当前Java后端开发的主流框架,其核心价值在于"约定大于配置",通过自动配置大幅简化了传统SSM(Spring + SpringMVC + MyBatis)整合的繁琐流程。传统SSM整合需要开发者手动编写大量配置类(如SpringConfig、SpringMvcConfig、MybatisConfig),而SpringBoot几乎零配置即可完成SSM环境的搭建。本文旨在系统讲解SpringBoot如何整合JUnit、MyBatis以及完整的SSM项目,同时深入剖析SpringBoot中Spring与SpringMVC的自动配置原理,帮助开发者快速掌握企业级开发的核心技巧。

一、基于SpringBoot实现SSM整合概述

1.1 SSM整合的核心逻辑

SSM框架组合的核心分工如下:

  • Spring:整个项目的核心容器,负责管理所有Bean的生命周期、依赖注入(IoC)、面向切面编程(AOP)等,是SSM的「灵魂」
  • SpringMVC:Web层框架,负责处理HTTP请求、响应,实现前后端交互,是SSM的「入口」
  • MyBatis:持久层框架,负责数据库的CRUD操作,是SSM的「数据交互层」

传统SSM整合需要手动将三个框架进行绑定,编写大量配置类完成容器初始化、组件扫描、Bean定义等工作;而SpringBoot通过自动配置,将Spring、SpringMVC的整合完全自动化,仅需手动完成MyBatis的整合,因此整合的核心逻辑可以总结为:

  • SpringBoot整合Spring(不存在):SpringBoot原生基于Spring构建,自动完成所有Spring核心配置,无需手动整合
  • SpringBoot整合SpringMVC(不存在)spring-boot-starter-web自动集成SpringMVC,自动完成所有Web层配置,无需手动整合
  • SpringBoot整合MyBatis(主要):MyBatis为第三方框架,需通过starter手动整合,是SSM整合的核心与重点

1.2 SpringBoot中Spring的体现与自动配置

SpringBoot的本质是「Spring的脚手架」,其核心就是Spring框架,因此不存在「手动整合Spring」的过程,所有Spring核心功能均由SpringBoot自动配置完成:

  1. 自动导入Spring核心依赖spring-boot-starter依赖自动导入了Spring的核心包(spring-contextspring-beansspring-core等),无需手动引入
  2. 自动配置IoC容器 :SpringBoot自动初始化Spring的核心容器ApplicationContext,管理所有Bean的生命周期
  3. 自动开启组件扫描 :默认以启动类所在包为根,扫描其及子包下所有@Component@Service@Controller@Repository等注解的类,自动将其纳入Spring容器管理,等价于传统@ComponentScan
  4. 自动支持依赖注入与AOP@Autowired@Resource依赖注入,@Aspect AOP切面等Spring核心功能开箱即用,无需手动配置
  5. 自动配置事务管理@Transactional事务注解自动生效,无需手动配置事务管理器、切面等

简单来说,SpringBoot已经帮我们完成了所有传统Spring的配置工作,我们只需要直接使用Spring的注解和功能即可,完全不需要手动编写SpringConfig等配置类。

1.3 SpringBoot中SpringMVC的体现与自动配置

SpringMVC是Spring的Web模块,spring-boot-starter-web依赖自动集成了SpringMVC,同样不存在「手动整合SpringMVC」的过程,所有Web层核心功能自动配置完成:

  1. 自动导入SpringMVC核心依赖spring-boot-starter-web自动导入了SpringMVC的核心包(spring-webmvc等),无需手动引入
  2. 自动配置核心组件DispatcherServlet :SpringBoot自动注册SpringMVC的前端控制器DispatcherServlet,默认拦截所有请求,自动处理请求分发
  3. 自动配置Web层核心组件 :自动注册处理器映射器(RequestMappingHandlerMapping)、处理器适配器(RequestMappingHandlerAdapter)、异常处理器、视图解析器等核心组件
  4. 自动支持Web层注解@Controller@RequestMapping@ResponseBody@RequestParam等SpringMVC注解自动生效,无需手动配置
  5. 自动配置静态资源映射 :默认将resources/staticresources/publicresources/resources等目录作为静态资源根目录,自动对外暴露,无需手动编写WebMvcConfigurationSupport配置类
  6. 自动配置嵌入式Web服务器:默认集成Tomcat作为嵌入式服务器,自动配置端口(默认8080),无需外部Tomcat部署,嵌入式Tomcat自动加载SpringMVC核心组件,无需web.xml

同样,SpringBoot帮我们完成了所有传统SpringMVC的配置工作,我们只需要直接使用SpringMVC的注解和功能即可,完全不需要手动编写SpringMvcConfig等配置类。

1.4 SpringBoot整合MyBatis的核心地位

MyBatis是第三方持久层框架,并非Spring原生组件,因此需要通过mybatis-spring-boot-starter手动完成整合,是SpringBoot整合SSM中唯一需要手动参与的部分,也是整合的核心:

  1. 需要手动配置数据源:需要在application.yml配置文件中配置数据库连接信息(驱动、URL、用户名、密码等)
  2. 需要手动配置MyBatis核心组件 :需要配置Mapper扫描或者@Mapper等(SpringBoot Starter会自动配置大部分,仅需少量配置)
  3. 需要手动编写Dao层代码:需要定义Mapper接口、SQL语句(注解或XML方式)
  4. 需要手动测试持久层功能:需要编写单元测试验证数据库操作的正确性

后续章节将详细讲解SpringBoot整合MyBatis的全流程,以及SSM完整项目的落地实现。

二、SpringBoot整合JUnit单元测试

2.1 传统Spring整合JUnit回顾

传统Spring整合JUnit需要手动指定运行器和配置类,步骤繁琐:

复制代码
@RunWith(SpringJUnit4ClassRunner.class) // 指定运行器
@ContextConfiguration(classes = SpringConfig.class) // 加载Spring配置类
public class UserServiceTest {
    @Autowired
    private BookService bookService;

    @Test
    public void testSave(){
        bookService.save();
    }
}

核心痛点:需要手动维护配置类,耦合度高,开发效率低。

2.2 SpringBoot整合JUnit核心步骤

SpringBoot通过@SpringBootTest注解彻底简化了单元测试,仅需3步:

  1. 在测试类上添加@SpringBootTest注解
  2. 使用@Autowired注入要测试的Bean
  3. 定义@Test测试方法执行测试

2.3 环境准备与代码实现

2.3.1 工程结构

创建SpringBoot项目springboot_07_test,结构如下:

复制代码
springboot_07_test
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com.itheima
│   │   │       ├── service
│   │   │       │   ├── BookService.java
│   │   │       │   └── impl
│   │   │       │       └── BookServiceImpl.java
│   │   │       └── Springboot07TestApplication.java
│   │   └── resources
│   │       └── application.properties
│   └── test
│       └── java
│           └── com.itheima
│               └── Springboot07TestApplicationTests.java
└── pom.xml
2.3.2 业务代码实现
  • BookService接口

    public interface BookService {
    void save();
    }

  • BookServiceImpl实现类

    @Service
    public class BookServiceImpl implements BookService {
    @Override
    public void save() {
    System.out.println("book service is running ...");
    }
    }

2.3.3 测试类编写

test/java下创建测试类:

复制代码
@SpringBootTest
class Springboot07TestApplicationTests {
    @Autowired
    private BookService bookService;

    @Test
    public void save() {
        bookService.save();
    }
}

2.4 关键注意事项

2.4.1 @SpringBootTest注解详解
说明
类型 测试类注解
位置 测试类定义上方
作用 设置JUnit加载的SpringBoot启动类
核心属性 classes:指定SpringBoot启动类,包不匹配时使用
范例 @SpringBootTest(classes = Springboot07JunitApplication.class)
2.4.2 包扫描规则

@SpringBootTest默认以测试类所在包 为起点,扫描其及子包下的所有组件(等价于传统@ComponentScan):

  • ✅ 合法场景:引导类(启动类)所在包 是 测试类所在包 或 其父包
  • ❌ 非法场景:测试类在引导类包之外,此时需要手动指定启动类:@SpringBootTest(classes = Springboot07TestApplication.class)

三、SpringBoot整合MyBatis(核心)

3.1 传统Spring整合MyBatis回顾

传统Spring整合MyBatis需要定义大量配置类,包括:

  • SpringConfig:组件扫描、加载配置、导入其他配置类
  • JdbcConfig:定义数据源(Druid)、加载数据库配置
  • MybatisConfig:定义SqlSessionFactoryBeanMapperScannerConfigurer

核心痛点:配置繁琐,维护成本高,SpringBoot通过starter自动配置彻底解决。

3.2 SpringBoot整合MyBatis全流程

3.2.1 创建模块

使用Spring Initializr创建项目,勾选依赖:

  • MyBatis Framework(MyBatis Starter)
  • MySQL Driver(MySQL驱动)
3.2.2 定义实体类

com.itheima.domain下创建Book实体:

复制代码
public class Book {
    private Integer id;
    private String name;
    private String type;
    private String description;

    // getter、setter
    // toString
}
3.2.3 定义Dao接口

com.itheima.dao下创建BookDao

复制代码
public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    Book getById(Integer id);
}
3.2.4 编写测试类
复制代码
@SpringBootTest
class Springboot08MybatisApplicationTests {
    @Autowired
    private BookDao bookDao;

    @Test
    void testGetById() {
        Book book = bookDao.getById(1);
        System.out.println(book);
    }
}
3.2.5 配置数据库连接

application.yml中配置:

复制代码
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db
    username: root
    password: root

3.3 常见问题与解决方案

问题 :No qualifying bean of type 'com.itheima.dao.BookDao' available
原因 :MyBatis会创建Dao接口的代理对象,但需要告诉Spring哪些是Dao接口。
解决方案 :在Dao接口上添加@Mapper注解:

复制代码
@Mapper
public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    Book getById(Integer id);
}

注意事项

SpringBoot版本低于2.4.3(不含)、MySQL驱动版本大于8.0时,需要在url中配置时区:

复制代码
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC

3.4 集成Druid数据源

SpringBoot默认数据源为Hikari,可替换为Druid:

  1. 导入Druid依赖pom.xml):

    <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>
  2. 修改配置文件

    spring:
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

四、SpringBoot整合SSM完整项目落地

4.1 工程创建与结构

创建SpringBoot项目springboot_09_ssm,勾选Web、MySQL、MyBatis依赖,结构如下:

复制代码
springboot_09_ssm
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com.itheima
│   │   │       ├── controller  # SpringMVC Web层
│   │   │       ├── dao        # MyBatis 持久层
│   │   │       ├── domain     # 实体类
│   │   │       ├── exception # 异常处理
│   │   │       ├── service   # Spring 业务层
│   │   │       └── Springboot09SsmApplication.java # 启动类
│   │   └── resources
│   │       ├── static  # 静态资源目录(SpringMVC自动映射)
│   │       │   ├── css
│   │       │   ├── js
│   │       │   ├── pages
│   │       │   └── plugins
│   │       ├── templates
│   │       └── application.yml # 全局配置文件
│   └── test
│       └── java
│           └── com.itheima
│               └── Springboot09SsmApplicationTests.java
└── pom.xml

pom.xml中导入Druid依赖(同3.4)。

Spring与SpringMVC在项目中的体现

  • service层的@Service注解:由Spring容器管理,实现业务逻辑的依赖注入
  • controller层的@Controller@RequestMapping注解:由SpringMVC处理,实现HTTP请求的分发与响应
  • 启动类Springboot09SsmApplication.java:SpringBoot自动扫描其包下所有组件,完成Spring、SpringMVC的自动配置

4.2 代码迁移与改造

将传统SSM项目代码迁移到SpringBoot,核心改造点:

  1. 删除传统配置类 :SpringBoot自动配置,无需SpringConfigSpringMvcConfig等配置类,直接删除
    > 原因:SpringBoot已经自动完成了Spring、SpringMVC的所有配置,传统配置类完全冗余

  2. Dao接口添加@Mapper :所有Dao接口添加@Mapper,让Spring管理MyBatis代理对象

  3. 测试类改造 :使用@SpringBootTest替换传统JUnit注解:

    @SpringBootTest
    public class BookServiceTest {
    @Autowired
    private BookService bookService;

    复制代码
     @Test
     public void testGetById(){
         Book book = bookService.getById(1);
         System.out.println(book);
     }
    
     @Test
     public void testGetAll(){
         List<Book> all = bookService.getAll();
         System.out.println(all);
     }

    }

  4. Controller层直接复用 :SpringBoot自动集成SpringMVC,Controller代码无需修改
    > 原因:SpringMVC的注解(@Controller@RequestMapping等)在SpringBoot中完全生效,无需额外配置

4.3 配置文件详解

完整application.yml配置:

复制代码
# 服务器端口(SpringBoot嵌入式Tomcat配置,SpringMVC依赖)
server:
  port: 80
# 数据源配置(MyBatis依赖,Druid数据源)
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    username: root
    password: root

配置说明

  • server.port:SpringBoot嵌入式Tomcat的端口,SpringMVC基于此端口对外提供服务
  • spring.datasource:MyBatis的数据源配置,SpringBoot自动将其注入到SqlSessionFactory中,完成MyBatis的整合

4.4 静态资源处理

4.4.1 传统SpringMVC的问题

传统SpringMVC需要手动继承WebMvcConfigurationSupport,重写addResourceHandlers配置静态资源:

复制代码
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}
4.4.2 SpringBoot的解决方案

SpringBoot完全不需要手动配置,核心原因:

  1. 约定大于配置+自动配置 :默认约定静态资源放在resources/staticresources/public等目录,自动识别并对外暴露
  2. Starter自动配置spring-boot-starter-web已集成SpringMVC所有基础功能,无需手动写配置类
  3. 简化开发目标:SpringBoot将重复配置自动化,仅当需要覆盖默认规则时才手动干预

五、开发小技巧:TODO标记的使用

TODO是开发中常用的代码标记(非英语语法的to do不定式),用于提醒开发者未完成的任务,所有主流IDE(IDEA、Eclipse)都支持。

5.1 写法

在代码注释中添加TODO关键词,支持单行/多行:

复制代码
// TODO: 这里要实现用户登录功能,包括密码加密
/*
TODO:
1. 补全订单状态校验逻辑
2. 对接支付接口
*/

5.2 常见使用场景

  • 标记待开发功能:写框架时先留TODO占位,后续填业务代码
  • 标记待优化代码:// TODO: 这里用了临时mock数据,需替换为真实接口
  • 标记待修复问题:// TODO: 这个循环有性能问题,要改成流式操作

5.3 IDE中的使用(以IDEA为例)

  • 查看TODO :点击左侧TODO面板(或View → Tool Windows → TODO),查看项目所有TODO,点击直接跳转代码
  • 过滤/分组 :按内容、文件路径筛选,多人协作可加自定义标签:// TODO: [张三] 处理订单超时逻辑

5.4 类似标记区别

标记 说明 优先级
TODO 待完成任务 普通
FIXME 必须修复的bug
NOTE 自定义备注 自定义

六、常见问题解答

6.1 为什么SpringBoot要配置端口,传统Spring不用?

场景 核心差异
SpringBoot 自带嵌入式Web服务器(Tomcat),是独立可运行的Web应用,必须配置端口(告诉服务器监听哪个端口),默认8080
传统Spring+MyBatis 依赖外部Web服务器(Tomcat)运行,端口在Tomcat的server.xml中配置,Spring项目本身无需配置

一句话总结:SpringBoot自己管端口,传统Spring端口由外部服务器管。

6.2 SpringBoot静态资源为什么不用手动配置?

SpringBoot遵循"约定大于配置",默认将resources/static等目录作为静态资源根目录,spring-boot-starter-web自动完成静态资源映射,无需手动写配置类,仅当需要自定义规则时才手动干预。

七、总结

本文从SSM整合核心原理出发,详细讲解了SpringBoot整合JUnit单元测试、MyBatis持久层、SSM全栈项目的完整流程,同时补充了开发实用技巧与常见问题解决方案。

SpringBoot整合SSM的核心就是**「约定大于配置」**:

  • Spring、SpringMVC由SpringBoot自动配置,完全不需要手动整合,开箱即用
  • MyBatis是唯一需要手动整合的部分,通过starter快速完成配置
  • 传统SSM的大量配置类完全冗余,直接删除即可,专注业务逻辑开发

掌握这些整合技巧,能大幅提升SpringBoot项目的开发效率,搭建高效、可维护的企业级项目。

相关推荐
yhole2 小时前
SpringBoot + vue 管理系统
vue.js·spring boot·后端
mcooiedo2 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
qq_297574672 小时前
RocketMQ系列文章(入门篇第6篇):延时消息+顺序消息实战
spring boot·rocketmq·java-rocketmq
zb200641203 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
indexsunny3 小时前
互联网大厂Java面试实战:基于微服务与云原生的电商场景问答解析
java·数据库·spring boot·docker·微服务·云原生·kubernetes
下地种菜小叶3 小时前
接口幂等怎么设计?一次讲清重复提交、支付回调、幂等键与防重落地方案
java·spring boot·spring·kafka·maven
YDS8293 小时前
大营销平台 —— 模板方法串联前中置抽奖规则
java·spring boot·ddd
时间静止不是简史3 小时前
当MyBatis-Plus的like遇上SQL通配符:下划线翻车记
java·sql·mybatis
喜欢流萤吖~3 小时前
SpringBoot 性能优化实战
spring boot·后端·性能优化