前言
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自动配置完成:
- 自动导入Spring核心依赖 :
spring-boot-starter依赖自动导入了Spring的核心包(spring-context、spring-beans、spring-core等),无需手动引入 - 自动配置IoC容器 :SpringBoot自动初始化Spring的核心容器
ApplicationContext,管理所有Bean的生命周期 - 自动开启组件扫描 :默认以启动类所在包为根,扫描其及子包下所有
@Component、@Service、@Controller、@Repository等注解的类,自动将其纳入Spring容器管理,等价于传统@ComponentScan - 自动支持依赖注入与AOP :
@Autowired、@Resource依赖注入,@AspectAOP切面等Spring核心功能开箱即用,无需手动配置 - 自动配置事务管理 :
@Transactional事务注解自动生效,无需手动配置事务管理器、切面等
简单来说,SpringBoot已经帮我们完成了所有传统Spring的配置工作,我们只需要直接使用Spring的注解和功能即可,完全不需要手动编写SpringConfig等配置类。
1.3 SpringBoot中SpringMVC的体现与自动配置
SpringMVC是Spring的Web模块,spring-boot-starter-web依赖自动集成了SpringMVC,同样不存在「手动整合SpringMVC」的过程,所有Web层核心功能自动配置完成:
- 自动导入SpringMVC核心依赖 :
spring-boot-starter-web自动导入了SpringMVC的核心包(spring-webmvc等),无需手动引入 - 自动配置核心组件DispatcherServlet :SpringBoot自动注册SpringMVC的前端控制器
DispatcherServlet,默认拦截所有请求,自动处理请求分发 - 自动配置Web层核心组件 :自动注册处理器映射器(
RequestMappingHandlerMapping)、处理器适配器(RequestMappingHandlerAdapter)、异常处理器、视图解析器等核心组件 - 自动支持Web层注解 :
@Controller、@RequestMapping、@ResponseBody、@RequestParam等SpringMVC注解自动生效,无需手动配置 - 自动配置静态资源映射 :默认将
resources/static、resources/public、resources/resources等目录作为静态资源根目录,自动对外暴露,无需手动编写WebMvcConfigurationSupport配置类 - 自动配置嵌入式Web服务器:默认集成Tomcat作为嵌入式服务器,自动配置端口(默认8080),无需外部Tomcat部署,嵌入式Tomcat自动加载SpringMVC核心组件,无需web.xml
同样,SpringBoot帮我们完成了所有传统SpringMVC的配置工作,我们只需要直接使用SpringMVC的注解和功能即可,完全不需要手动编写SpringMvcConfig等配置类。
1.4 SpringBoot整合MyBatis的核心地位
MyBatis是第三方持久层框架,并非Spring原生组件,因此需要通过mybatis-spring-boot-starter手动完成整合,是SpringBoot整合SSM中唯一需要手动参与的部分,也是整合的核心:
- 需要手动配置数据源:需要在application.yml配置文件中配置数据库连接信息(驱动、URL、用户名、密码等)
- 需要手动配置MyBatis核心组件 :需要配置
Mapper扫描或者@Mapper等(SpringBoot Starter会自动配置大部分,仅需少量配置) - 需要手动编写Dao层代码:需要定义Mapper接口、SQL语句(注解或XML方式)
- 需要手动测试持久层功能:需要编写单元测试验证数据库操作的正确性
后续章节将详细讲解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步:
- 在测试类上添加
@SpringBootTest注解 - 使用
@Autowired注入要测试的Bean - 定义
@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:定义SqlSessionFactoryBean、MapperScannerConfigurer
核心痛点:配置繁琐,维护成本高,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:
-
导入Druid依赖 (
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>pom.xml): -
修改配置文件:
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,核心改造点:
-
删除传统配置类 :SpringBoot自动配置,无需
SpringConfig、SpringMvcConfig等配置类,直接删除
> 原因:SpringBoot已经自动完成了Spring、SpringMVC的所有配置,传统配置类完全冗余 -
Dao接口添加@Mapper :所有Dao接口添加
@Mapper,让Spring管理MyBatis代理对象 -
测试类改造 :使用
@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); }}
-
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完全不需要手动配置,核心原因:
- 约定大于配置+自动配置 :默认约定静态资源放在
resources/static、resources/public等目录,自动识别并对外暴露 - Starter自动配置 :
spring-boot-starter-web已集成SpringMVC所有基础功能,无需手动写配置类 - 简化开发目标: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项目的开发效率,搭建高效、可维护的企业级项目。