主题
概述
Spring Boot 是基于 Spring 框架的企业级应用开发框架,简化了 Spring 应用的初始搭建和开发过程。它采用"约定优于配置"的理念,让开发者能够快速创建独立运行的、生产级别的应用程序。
为什么选择 Spring Boot?
- 工业标准:Java 生态最成熟的企业级框架
- 生态丰富:Spring Cloud、Spring Security 等配套完善
- 性能优秀:经过大量生产环境验证
- 文档完善:社区活跃,资料丰富
技术特性
| 特性 | 说明 |
|---|---|
| 编程语言 | Java 17+ / Kotlin |
| 架构模式 | MVC / 分层架构 / 依赖注入 |
| ORM 支持 | MyBatis Plus (推荐), Spring Data JPA, Ktorm |
| 数据库 | PostgreSQL, MySQL, SQLite |
| 性能评分 | ★★★★★ |
| 学习曲线 | 中等(需要 Java 基础) |
| API 文档 | SpringDoc / Swagger 自动生成 |
| 认证方案 | Sa-Token, Spring Security |
语言选择
Spring Boot 支持两种 JVM 语言:
| 语言 | 特点 | 推荐场景 |
|---|---|---|
| Java | 语法熟悉、生态成熟、招聘容易 | 大型企业项目、团队协作 |
| Kotlin | 语法简洁、空安全、协程支持 | 现代化项目、追求开发效率 |
语言建议
- 如果团队熟悉 Java 或项目需要长期维护,选择 Java
- 如果追求开发效率或个人项目,可选择 Kotlin
生成的项目结构
ThesisAI 生成的 Spring Boot 项目遵循标准的分层架构:
backend
src
main
java/com/example/demo
common // 公共模块
config // 配置类
exception // 全局异常处理
response // 统一响应封装
utils // 工具类
modules // 业务模块
auth // 认证模块(可选)
controller
service
dto
user // 用户模块
controller
service
mapper // MyBatis Mapper
entity // 实体类
dto
[业务模块] // 根据需求生成
Application.java // 启动类
resources
application.yml // 主配置
application-dev.yml // 开发环境配置
application-prod.yml // 生产环境配置
mapper // MyBatis XML
test // 测试代码
Dockerfile
docker-compose.yml
pom.xml // Maven 配置
ORM 选择
Spring Boot 支持多种 ORM 框架:
MyBatis Plus(推荐)
Mybatis MyBatis Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变。优势:
- SQL 完全可控,复杂查询自由
- 代码生成器,减少样板代码
- 中国用户群体大,中文文档友好
UserMapper.java
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 简单 CRUD 直接使用继承的方法
// 复杂查询使用 XML 或注解
@Select("SELECT * FROM user WHERE email = #{email}")
User findByEmail(@Param("email") String email);
}Spring Data JPA
Jpa JPA 是 Java 持久化 API 规范,Spring Data JPA 让使用更加简单。优势:
- 对象关系映射自动化
- 方法名自动生成查询
- 跨数据库迁移容易
UserRepository.java
java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// 方法名自动生成查询
Optional<User> findByEmail(String email);
List<User> findByStatusAndCreatedAtAfter(Integer status, LocalDateTime date);
}Ktorm(Kotlin 专属)
Ktorm 是 Kotlin 原生的 ORM 框架,提供类型安全的 DSL 风格 API。
优势:
- Kotlin 原生,类型安全
- DSL 风格,代码简洁
- 轻量级,无反射
UserTable.kt
kotlin
object Users : Table<User>("user") {
val id = long("id").primaryKey().bindTo { it.id }
val email = varchar("email").bindTo { it.email }
val name = varchar("name").bindTo { it.name }
val status = int("status").bindTo { it.status }
}
// 使用示例
val users = database
.from(Users)
.select()
.where { Users.status eq 1 }
.map { Users.createEntity(it) }认证方案
Sa-Token(推荐)
Sa-Token 是一个轻量级 Java 权限认证框架,上手简单,功能强大。
AuthController.java
java
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired
private UserService userService;
@PostMapping("/login")
public R<String> login(@RequestBody LoginDto dto) {
User user = userService.login(dto.getUsername(), dto.getPassword());
// Sa-Token 登录
StpUtil.login(user.getId());
return R.ok(StpUtil.getTokenValue());
}
@PostMapping("/logout")
public R<Void> logout() {
StpUtil.logout();
return R.ok();
}
@GetMapping("/info")
@SaCheckLogin // 登录校验注解
public R<User> info() {
long userId = StpUtil.getLoginIdAsLong();
return R.ok(userService.getById(userId));
}
}Spring Security
Spring Security 是 Spring 官方提供的安全框架,功能完善但配置较复杂。
开发环境
环境要求
| 依赖 | 版本要求 | 说明 |
|---|---|---|
| JDK | >= 17 | 推荐 Eclipse Temurin |
| Maven | >= 3.8 | 构建工具 |
| 数据库 | - | SQLite 无需安装,MySQL/PostgreSQL 需独立服务 |
环境变量 / 配置
| 变量名 | 说明 | 必填 |
|---|---|---|
| spring.datasource.url 默认值: jdbc:sqlite:./dev.db | 数据库连接 URL | 是 |
| spring.datasource.username 默认值: - | 数据库用户名 | 否 |
| spring.datasource.password 默认值: - | 数据库密码 | 否 |
| sa-token.token-name 默认值: Authorization | Token 名称 | 否 |
| sa-token.timeout 默认值: 86400 | Token 有效期(秒) | 否 |
| server.port 默认值: 8080 | 服务端口 | 否 |
数据库连接配置示例
application.yml
yaml
spring:
datasource:
# SQLite(默认)
url: jdbc:sqlite:./dev.db
driver-class-name: org.sqlite.JDBC
# PostgreSQL
# url: jdbc:postgresql://localhost:5432/mydb
# username: postgres
# password: password
# driver-class-name: org.postgresql.Driver
# MySQL
# url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
# username: root
# password: password
# driver-class-name: com.mysql.cj.jdbc.Driver启动开发服务器
bash
$
./mvnw spring-boot:run
或使用 IDE 直接运行 Application.java。
服务启动成功
- API 地址:
http://localhost:8080 - Swagger 文档:
http://localhost:8080/swagger-ui.html
代码示例
Controller 示例
UserController.java
java
@RestController
@RequestMapping("/api/users")
@Tag(name = "用户管理")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
@Operation(summary = "创建用户")
public R<User> create(@Valid @RequestBody CreateUserDto dto) {
return R.ok(userService.create(dto));
}
@GetMapping("/{id}")
@Operation(summary = "获取用户详情")
@SaCheckLogin
public R<User> getById(@PathVariable Long id) {
return R.ok(userService.getById(id));
}
@GetMapping
@Operation(summary = "分页查询用户")
public R<Page<User>> list(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size
) {
return R.ok(userService.page(new Page<>(page, size)));
}
}Service 示例
UserServiceImpl.java
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {
@Override
public User create(CreateUserDto dto) {
// 检查邮箱是否已存在
if (this.lambdaQuery().eq(User::getEmail, dto.getEmail()).exists()) {
throw new BusinessException("邮箱已被注册");
}
User user = new User();
BeanUtils.copyProperties(dto, user);
user.setPassword(BCrypt.hashpw(dto.getPassword(), BCrypt.gensalt()));
user.setCreatedAt(LocalDateTime.now());
this.save(user);
return user;
}
}部署
Docker 部署
bash
$
docker build -t backend .
bash
$
docker run -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod backend
生产构建
bash
$
./mvnw clean package -DskipTests
bash
$
java -jar target/demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
生产环境注意事项
- 使用生产环境配置文件
application-prod.yml - 配置合适的数据库连接池参数
- 启用 HTTPS
- 配置日志级别和日志文件
常见问题
Q: Maven 下载依赖很慢?
配置阿里云 Maven 镜像:
settings.xml
xml
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>Q: 如何添加新的业务模块?
- 在
modules目录下创建新包 - 创建 Entity、Mapper、Service、Controller
- 如使用 MyBatis Plus,Mapper 继承
BaseMapper
Q: MyBatis Plus 和 JPA 如何选择?
- MyBatis Plus:适合需要手写复杂 SQL、对性能要求高的场景
- JPA:适合 CRUD 为主、希望快速开发的场景