1. SSM与SpringBoot的江湖地位与时代背景
在Java企业级开发领域,SSM(Spring+Spring MVC+MyBatis)和SpringBoot这两个技术组合就像武林中的两大门派。2015年之前,SSM框架组合是绝对的霸主,几乎统治了所有传统企业级项目的开发。我当时参与的几个银行系统项目,清一色都是基于SSM架构搭建的。这种组合中,Spring负责IoC和AOP的核心管理,Spring MVC处理Web层请求调度,MyBatis则承担数据持久化的职责。
而SpringBoot的出现就像一位带着"约定优于配置"理念的年轻高手,它本质上是对Spring生态的封装和升级。2014年SpringBoot 1.0发布时,很多老牌开发者(包括我在内)都持观望态度。但到2016年2.0版本后,其自动配置、起步依赖等特性彻底改变了JavaEE开发的游戏规则。现在回头看,SpringBoot并不是要取代SSM,而是让开发者能够更专注于业务逻辑而非配置细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构对比:从齿轮组到智能机器
2.1 SSM的模块化架构特点
SSM框架组合就像一台精密的机械手表,每个部件都需要手动组装和调校。以我去年改造的一个老项目为例,其典型配置包括:
- Spring配置:applicationContext.xml中需要显式定义Bean扫描路径、事务管理器等
xml复制<context:component-scan base-package="com.example"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
- Spring MVC配置:dispatcher-servlet.xml中要配置视图解析器、静态资源处理等
xml复制<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:resources mapping="/static/**" location="/static/"/>
- MyBatis整合:需要单独配置SqlSessionFactory和Mapper扫描
java复制@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/*.xml"));
return factoryBean.getObject();
}
这种显式配置虽然灵活,但新手很容易在XML和JavaConfig之间迷失方向。我曾经接手过一个项目,光Spring配置文件就有17个,排查一个Bean注入问题花了整整两天时间。
2.2 SpringBoot的自动化架构
相比之下,SpringBoot更像是装了AI芯片的智能设备。它的自动配置机制基于条件化装配(@Conditional)实现,以web应用为例:
- 当检测到classpath下有spring-webmvc依赖时,自动配置DispatcherServlet
- 发现Jackson库存在时,自动配置JSON消息转换器
- 根据application.properties中的spring.datasource.*参数自动创建数据源
这种机制背后是spring-boot-autoconfigure模块中大量的自动配置类。比如最常用的DataSourceAutoConfiguration:
java复制@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// 自动配置数据源的逻辑
}
实战经验:在SpringBoot项目中,可以通过在application.properties中添加debug=true来查看生效的自动配置报告,这对理解底层机制非常有帮助。
3. 开发体验的维度对比
3.1 项目初始化对比
SSM项目的初始化就像从零开始组装电脑:
- 手动创建Maven项目
- 逐个添加Spring、Spring MVC、MyBatis依赖
- 配置web.xml(Servlet 3.0前还需要配置DispatcherServlet)
- 编写各种XML配置文件
而SpringBoot使用start.spring.io初始化项目就像购买品牌整机:
bash复制# 快速创建包含web和mybatis的SpringBoot项目
curl https://start.spring.io/starter.tgz \
-d dependencies=web,mybatis \
-d packageName=com.example \
-d name=demo \
-d type=maven-project \
| tar -xzvf -
3.2 日常开发中的典型差异
在控制器层开发时,SSM需要显式配置@Controller和@ResponseBody:
java复制@Controller
@RequestMapping("/api")
public class UserController {
@ResponseBody
@GetMapping("/users")
public List<User> listUsers() {
// ...
}
}
而SpringBoot中可以直接用@RestController组合注解:
java复制@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public List<User> listUsers() {
// ...
}
}
在MyBatis集成方面,SSM需要手动配置MapperScannerConfigurer:
xml复制<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
SpringBoot只需在启动类加@MapperScan:
java复制@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4. 深度技术整合分析
4.1 依赖管理的进化
传统SSM项目需要开发者自行管理各组件版本兼容性。比如Spring 5.3.18需要配合MyBatis 3.5.9,而错误搭配可能导致难以排查的问题。
SpringBoot通过BOM(Bill of Materials)机制解决了这个问题。在spring-boot-dependencies的pom.xml中明确定义了所有推荐版本:
xml复制<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 其他依赖版本管理 -->
</dependencies>
</dependencyManagement>
4.2 配置体系的变革
SSM时代需要维护多个配置文件:
- Spring的applicationContext.xml
- Spring MVC的dispatcher-servlet.xml
- MyBatis的mybatis-config.xml
- 数据库连接的jdbc.properties
SpringBoot统一采用application.yml/application.properties,支持多环境配置:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/demo
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
避坑指南:在YAML文件中缩进必须使用空格而非Tab键,这是常见的配置错误来源。
5. 性能与扩展性对比
5.1 启动性能差异
在相同硬件环境下测试(MacBook Pro M1, 16GB内存):
- 传统SSM项目平均启动时间:8-12秒
- SpringBoot项目(2.7.0版本)平均启动时间:3-5秒
这个差异主要来自:
- SpringBoot的组件延迟初始化特性
- 内嵌Tomcat的优化启动流程
- 类路径扫描的优化算法
5.2 扩展机制对比
SSM的扩展通常通过BeanPostProcessor等标准Spring扩展点实现,需要开发者对Spring底层有较深理解。
SpringBoot提供了更友好的扩展方式:
- 通过@ConfigurationProperties实现自定义配置绑定
- 使用SpringBoot的Conditional系列注解控制Bean加载
- 通过EnvironmentPostProcessor干预环境准备阶段
例如自定义Starter的典型结构:
code复制my-starter/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── autoconfigure/
│ │ │ │ ├── MyAutoConfiguration.java
│ │ │ │ └── MyProperties.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
6. 现代开发中的选型建议
6.1 适合SSM的场景
- 需要深度定制Spring容器行为的老系统维护
- 对启动时内存占用极其敏感的边缘计算场景
- 已有大量SSM配置积累的团队渐进式改造
6.2 SpringBoot的适用领域
- 微服务架构中的独立服务模块
- 需要快速迭代验证的创业项目
- 云原生环境下的容器化部署
6.3 渐进式迁移策略
对于存量SSM项目,可以采用"分而治之"的迁移方案:
- 先将项目转为SpringBoot的war包部署方式
java复制@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
- 逐步用application.properties替换原有XML配置
- 最后改为jar包方式运行并启用内嵌容器
7. 常见问题解决方案
7.1 多数据源配置差异
SSM中需要手动配置多个SqlSessionTemplate:
java复制@Bean
@Primary
public DataSource primaryDataSource() {
// 配置主数据源
}
@Bean
public DataSource secondaryDataSource() {
// 配置从数据源
}
SpringBoot中可以使用AbstractRoutingDataSource更优雅地实现:
java复制public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
7.2 事务管理配置
SSM需要显式配置事务管理器:
xml复制<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
SpringBoot自动配置的事务管理器可以通过以下方式定制:
java复制@Configuration
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource) {
@Override
protected void doBegin(Object transaction, TransactionDefinition definition) {
// 自定义事务开始逻辑
super.doBegin(transaction, definition);
}
};
}
}
7.3 热部署体验
SSM项目通常依赖JRebel等付费工具实现热部署,而SpringBoot DevTools提供了开箱即用的热加载支持:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
配置后修改Java代码保存时,应用会在1-2秒内自动重启。对于静态资源,更是支持无需重启的即时刷新。
