1. SSM与SpringBoot框架概述
SSM(Spring + Spring MVC + MyBatis)是Java企业级开发中经典的框架组合,而SpringBoot则是基于Spring框架的"约定优于配置"理念发展而来的新一代开发框架。这两个技术栈在Java开发领域占据着重要地位,但它们的定位和使用场景有着显著差异。
SSM框架组合中,Spring负责依赖注入和事务管理,Spring MVC处理Web层请求分发,MyBatis作为ORM框架实现数据库操作。这种组合需要开发者手动配置大量XML文件,虽然灵活但配置繁琐。SpringBoot则通过自动配置和起步依赖简化了这一过程,让开发者能够快速搭建和运行项目。
提示:SpringBoot并不是要取代SSM,而是提供了一种更高效的开发方式。许多SpringBoot项目底层仍然使用Spring、Spring MVC和MyBatis(或JPA)等技术。
1.1 SpringBoot的核心优势
SpringBoot的主要优势体现在以下几个方面:
-
自动配置:基于类路径上的jar包依赖自动配置Spring应用。例如,当检测到H2数据库在类路径上时,SpringBoot会自动配置内存数据库。
-
起步依赖:通过starter POMs简化Maven/Gradle配置,只需声明一个依赖就能引入一组相关的库。
-
内嵌服务器:内置Tomcat、Jetty或Undertow等服务器,无需部署WAR文件。
-
生产就绪特性:提供健康检查、指标、外部化配置等生产环境需要的功能。
-
命令行界面:可选特性,用于快速原型开发和Groovy脚本执行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SpringBoot项目创建与环境搭建
2.1 使用IDEA创建SpringBoot项目
IntelliJ IDEA是目前最流行的SpringBoot开发工具之一。创建SpringBoot项目的步骤如下:
- 打开IDEA,选择"File" → "New" → "Project"
- 在左侧菜单中选择"Spring Initializr"
- 配置项目基本信息:
- Project SDK:选择Java版本(推荐JDK 11或17)
- Initializr Service URL:使用默认的https://start.spring.io
- 填写Group、Artifact和Package名称
- 选择SpringBoot版本(当前稳定版为3.x系列)
- 添加项目依赖(如Spring Web、MyBatis、Lombok等)
- 指定项目名称和位置,点击"Finish"完成创建
注意:SpringBoot 3.x需要Java 17或更高版本,如果使用Java 8或11,应选择SpringBoot 2.7.x版本。
2.2 基础项目结构解析
一个标准的SpringBoot项目结构如下:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── demo/
│ │ ├── DemoApplication.java # 主启动类
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 业务服务
│ │ ├── dao/ # 数据访问
│ │ └── entity/ # 实体类
│ └── resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ ├── application.yml # 配置文件
│ └── application-dev.yml # 开发环境配置
└── test/ # 测试代码
pom.xml # Maven构建文件
2.3 多环境配置管理
在实际开发中,我们通常需要为不同环境(开发、测试、生产)配置不同的参数。SpringBoot支持通过profile实现多环境配置:
-
创建多个配置文件:
- application.yml:基础配置
- application-dev.yml:开发环境配置
- application-prod.yml:生产环境配置
-
在application.yml中指定激活的profile:
yaml复制spring:
profiles:
active: dev
- 或者在启动时通过命令行参数指定:
bash复制java -jar myapp.jar --spring.profiles.active=prod
3. SpringBoot核心功能实现
3.1 自动装配原理深度解析
SpringBoot自动装配的核心是@SpringBootApplication注解,它实际上是三个注解的组合:
- @SpringBootConfiguration:标识这是一个配置类
- @EnableAutoConfiguration:启用自动配置
- @ComponentScan:启用组件扫描
自动配置的实现机制:
- SpringBoot启动时加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
- 根据条件注解(如@ConditionalOnClass)判断是否加载特定配置
- 创建并注册符合条件的Bean到应用上下文
自定义starter的步骤:
- 创建autoconfigure模块,包含自动配置类
- 在src/main/resources/META-INF/spring/下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
- 编写配置类,使用@Configuration和条件注解
- 创建starter模块,依赖autoconfigure模块
3.2 数据库访问与MyBatis集成
SpringBoot集成MyBatis的常用方式:
- 添加依赖:
xml复制<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
- 配置数据源(application.yml):
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
- 创建Mapper接口:
java复制@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
}
- 在Service中注入Mapper:
java复制@Service
@RequiredArgsConstructor
public class UserService {
private final UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.findById(id);
}
}
3.3 事务管理
SpringBoot默认启用事务管理,只需在方法或类上添加@Transactional注解:
java复制@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
private final InventoryService inventoryService;
@Transactional
public void placeOrder(Order order) {
// 扣减库存
inventoryService.reduceStock(order.getProductId(), order.getQuantity());
// 创建订单
orderRepository.save(order);
}
}
事务传播行为(常见选项):
- REQUIRED(默认):如果当前没有事务,就新建一个事务
- REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
- NESTED:如果当前存在事务,则在嵌套事务内执行
4. SpringBoot高级特性与实战技巧
4.1 文件上传与下载
大文件上传处理方案:
- 配置文件上传限制(application.yml):
yaml复制spring:
servlet:
multipart:
max-file-size: 1024MB
max-request-size: 1024MB
- 分片上传实现:
java复制@RestController
@RequestMapping("/file")
public class FileController {
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "上传失败,请选择文件";
}
try {
// 获取文件内容
byte[] bytes = file.getBytes();
// 保存文件
Path path = Paths.get("/upload/" + file.getOriginalFilename());
Files.write(path, bytes);
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}
4.2 集成Redis缓存
- 添加依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置Redis连接:
yaml复制spring:
redis:
host: localhost
port: 6379
password:
database: 0
- 使用RedisTemplate:
java复制@Service
@RequiredArgsConstructor
public class CacheService {
private final RedisTemplate<String, Object> redisTemplate;
public void set(String key, Object value, long timeout) {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
}
4.3 安全防护措施
- 防止未授权访问:
java复制@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(withDefaults())
.httpBasic(withDefaults());
return http.build();
}
}
- 配置HTTPS:
yaml复制server:
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: changeit
key-store-type: PKCS12
key-alias: tomcat
5. SpringBoot项目部署与监控
5.1 Docker部署SpringBoot应用
- 创建Dockerfile:
dockerfile复制FROM eclipse-temurin:17-jdk-jammy
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- 构建镜像:
bash复制docker build -t myapp .
- 运行容器:
bash复制docker run -d -p 8080:8080 --name myapp myapp
5.2 使用Jenkins实现CI/CD
Jenkinsfile示例:
groovy复制pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Deploy') {
steps {
sh 'docker build -t myapp .'
sh 'docker stop myapp || true'
sh 'docker rm myapp || true'
sh 'docker run -d -p 8080:8080 --name myapp myapp'
}
}
}
}
5.3 应用监控与健康检查
SpringBoot Actuator提供生产级监控功能:
- 添加依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 配置端点暴露:
yaml复制management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
- 常用监控端点:
- /actuator/health:应用健康状态
- /actuator/info:应用信息
- /actuator/metrics:应用指标
- /actuator/env:环境变量
6. 常见问题与解决方案
6.1 启动类无法扫描到组件
可能原因及解决方案:
- 启动类不在根包下:确保启动类位于根包或使用@ComponentScan指定扫描路径
- 组件未添加注解:确保Controller添加@Controller或@RestController,Service添加@Service
- 包名不一致:检查组件是否在启动类所在包或其子包下
6.2 MyBatis映射文件找不到
解决方案:
- 在application.yml中配置mapper-locations:
yaml复制mybatis:
mapper-locations: classpath:mapper/*.xml
- 确保XML文件位于resources/mapper目录下
- 检查XML文件中的namespace与Mapper接口全限定名一致
6.3 事务不生效的常见原因
- 方法不是public:@Transactional只能应用于public方法
- 自调用问题:同一个类中方法调用不会经过代理
- 异常类型不正确:默认只对RuntimeException回滚
- 数据库引擎不支持:如使用MyISAM引擎
6.4 跨域问题解决
配置全局CORS:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
或者使用注解方式:
java复制@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "*")
public class ApiController {
// ...
}
7. 性能优化建议
7.1 JVM参数调优
常用启动参数:
bash复制java -Xms512m -Xmx1024m -XX:+UseG1GC -jar myapp.jar
参数说明:
- -Xms:初始堆大小
- -Xmx:最大堆大小
- -XX:+UseG1GC:使用G1垃圾收集器
7.2 数据库连接池配置
HikariCP推荐配置:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 10
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
7.3 缓存策略优化
多级缓存实现方案:
- 本地缓存(Caffeine)
- 分布式缓存(Redis)
- 数据库缓存(MyBatis二级缓存)
示例配置:
java复制@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CaffeineCacheManager caffeineCacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(1000));
return cacheManager;
}
}
8. 从SSM迁移到SpringBoot的注意事项
8.1 配置文件转换
SSM中的XML配置转换为SpringBoot的配置方式:
- 数据源配置:从XML转为application.yml
- MyBatis配置:从mybatis-config.xml转为application.yml中的mybatis配置
- Spring MVC配置:通过WebMvcConfigurer接口实现
8.2 依赖管理变化
- 使用starter替代手动管理依赖
- 注意版本兼容性:
- SpringBoot 2.x对应Spring 5.x
- SpringBoot 3.x对应Spring 6.x
8.3 常见兼容性问题
- 注解差异:如@Controller和@RestController
- 静态资源处理:SpringBoot默认将静态资源放在resources/static下
- 视图解析器:Thymeleaf成为更常用的模板引擎
迁移步骤建议:
- 先创建一个干净的SpringBoot项目
- 逐步迁移各个模块(DAO → Service → Controller)
- 分阶段测试,确保功能正常
- 优化配置,利用SpringBoot特性简化代码
