1. 为什么选择Spring Boot作为Java Web开发起点
十年前我刚接触Java Web开发时,配置一个Struts2项目需要折腾半天,光是各种XML配置就能写满三页A4纸。直到2014年Spring Boot问世,我才真正体会到什么叫"约定优于配置"的开发体验。现在带新人入门,我一定会推荐从Spring Boot开始,原因很实在:
- 自动配置魔法:以前整合MyBatis要手动配置SqlSessionFactory、DataSource等一堆Bean,现在只要一个
@MapperScan注解 - 内嵌容器开箱即用:无需额外安装Tomcat,直接
mvn spring-boot:run就能启动Web服务 - starter依赖简化构建:比如要开发Web项目,只需引入
spring-boot-starter-web,所有相关依赖自动配齐
新手常见误区:很多初学者会纠结Spring Boot和Spring MVC的关系。其实Spring Boot是Spring框架的"快捷包装",而Spring MVC是其中的Web模块。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境搭建实战
2.1 JDK安装避坑指南
最近帮学弟排查一个诡异问题:项目本地运行正常,打包后却报UnsupportedClassVersionError。根本原因是他的IDEA默认用了JDK17编译,而服务器用的是JDK8。这里分享我的环境配置清单:
-
JDK版本选择:
- 生产环境推荐JDK11(LTS长期支持版)
- 学习可以用最新JDK21,但要注意
--release参数
bash复制# 编译时指定目标版本 javac --release 8 Main.java -
环境变量配置:
bash复制# 检查安装是否成功 java -version javac -version
2.2 IDEA高效配置技巧
作为用过Eclipse、NetBeans的老玩家,我强烈推荐IntelliJ IDEA终极版。这几个设置能让你编码效率翻倍:
- 开启注解处理:File > Settings > Build > Compiler > Annotation Processors
- 配置自动导包:Editor > General > Auto Import
- 必备插件:
- Lombok(自动生成getter/setter)
- MyBatisX(Mapper接口与XML跳转)
- Grep Console(日志着色)
3. 第一个Spring Boot项目解剖
3.1 项目结构深度解读
用Spring Initializr生成项目后,我习惯这样组织包结构:
code复制src/main/java
└── com.example
├── config # 配置类
├── controller # 控制器层
├── service # 业务逻辑层
├── mapper # 数据访问层
└── model # 实体类
特别提醒:application.properties和application.yml不要混用,团队统一格式。个人推荐yml,因为支持层级结构:
yaml复制server:
port: 8080
servlet:
context-path: /api
3.2 编写第一个REST接口
下面这个Controller演示了最完整的请求处理流程:
java复制@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.getById(id));
}
@PostMapping
public ResponseEntity<Void> createUser(@Valid @RequestBody UserDTO dto) {
userService.create(dto);
return ResponseEntity.created(URI.create("/users")).build();
}
}
注意几个关键点:
@Valid注解实现参数自动校验ResponseEntity可以灵活设置状态码和Header- 路径变量用
@PathVariable获取
4. 数据库集成实战
4.1 MyBatis vs JPA选型建议
我带过的5个企业项目中,3个用MyBatis,2个用JPA。它们的核心区别:
| 特性 | MyBatis | JPA |
|---|---|---|
| SQL控制度 | 完全手写SQL | 自动生成,可自定义 |
| 学习曲线 | 简单 | 较陡峭 |
| 动态SQL支持 | 强大(XML/注解) | 有限 |
| 适合场景 | 复杂查询、遗留系统 | 快速开发、简单CRUD |
新手建议从MyBatis开始,先用它的Generator自动生成基础代码:
xml复制<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.1</version>
</plugin>
4.2 事务管理踩坑记录
去年有个支付功能出现部分更新问题,原因是没加事务注解。正确做法:
java复制@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderMapper orderMapper;
private final PaymentMapper paymentMapper;
@Transactional(rollbackFor = Exception.class)
public void createOrder(OrderDTO dto) {
orderMapper.insert(dto);
paymentMapper.create(dto.getPayment());
// 其他业务操作...
}
}
关键点:
- 默认只回滚RuntimeException,要用
rollbackFor指定所有异常 - 事务方法不能自调用(AOP失效问题)
- 建议在Service层加注解,而不是Controller
5. 项目打包与部署
5.1 多环境配置技巧
实际项目必有dev/test/prod环境,我的配置方案:
yaml复制# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://prod-db:3306/prod_db
username: ${DB_USER}
password: ${DB_PASS}
启动时指定环境:
bash复制java -jar app.jar --spring.profiles.active=prod
5.2 Docker化最佳实践
这是我优化过的Dockerfile模板:
dockerfile复制FROM eclipse-temurin:11-jre
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
构建命令:
bash复制# 先打包
mvn clean package -DskipTests
# 再构建镜像
docker build -t myapp .
# 运行
docker run -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=prod" myapp
6. 常见问题排雷手册
6.1 启动类无法扫描组件
症状:启动报Consider defining a bean of type...
解决方案:
- 确保启动类在顶层包,其他类在其子包
- 或用
@ComponentScan手动指定包路径 - 检查是否漏了
@Repository/@Service注解
6.2 跨域问题处理
前端报错No 'Access-Control-Allow-Origin'时,三种解决方案:
- 全局配置(推荐):
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*");
}
}
- 控制器局部注解:
java复制@CrossOrigin(origins = "http://localhost:3000")
@RestController
public class UserController {}
- 过滤器方式(适合Gateway)
7. 性能优化实战技巧
7.1 接口响应慢排查步骤
上周刚解决一个查询3秒的问题,我的排查路线:
- 用
@Slf4j记录方法耗时 - 检查SQL是否走索引(
EXPLAIN命令) - 确认N+1查询问题(MyBatis开启
log-impl: STDOUT_LOGGING) - 检查线程阻塞(
jstack工具)
7.2 缓存应用实战
Redis整合三步走:
- 添加依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置连接:
yaml复制spring:
redis:
host: localhost
port: 6379
- 使用注解缓存:
java复制@Cacheable(value = "users", key = "#id")
public User getById(Long id) {
return userMapper.selectById(id);
}
8. 项目结构升级建议
当项目发展到10万行代码时,推荐改用模块化结构:
code复制my-project
├── common-module # 通用工具
├── user-module # 用户服务
├── order-module # 订单服务
└── gateway # 统一入口
每个模块有自己的:
application.yml- 启动类(可选)
- 独立测试套件
构建多模块项目关键点:
- 父pom用
<packaging>pom</packaging> - 子模块用
<parent>指定父项目 - 模块间依赖用
<dependency>
9. 学习路线规划建议
根据我带实习生的经验,推荐的学习路径:
-
基础阶段(2周):
- 掌握Spring IoC/DI原理
- 能写CRUD接口
- 理解HTTP协议
-
进阶阶段(1个月):
- 实现JWT认证
- 掌握MyBatis动态SQL
- 会用Swagger生成API文档
-
实战阶段(2个月):
- 开发一个完整的管理系统
- 集成消息队列(如RabbitMQ)
- 实现分布式锁
建议每天保持2小时编码+1小时阅读源码的习惯。我刚开始看Spring源码时,从@SpringBootApplication注解开始逐步深入,三个月后突然开窍。
10. 面试常见问题解析
最近面试了20多个Java候选人,整理出高频问题:
Q:Spring Boot自动配置原理?
A:关键流程:
- 扫描
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - 通过
@Conditional系列注解按条件加载配置 - 通过
@EnableConfigurationProperties绑定配置属性
Q:如何设计RESTful API?
A:我的实践标准:
- 资源用名词复数(
/users) - HTTP方法对应操作(GET获取/POST创建)
- 状态码要精确(201 Created/204 No Content)
- 版本控制用Header(
Accept: application/vnd.api.v1+json)
最后给初学者的忠告:不要停留在理论层面,马上动手创建一个Spring Boot项目,从实现一个简单的TODO API开始。遇到问题先看官方文档(spring.io),再查Stack Overflow。坚持三个月,你会感谢现在开始行动的自己。
