F04 | 后端框架选型:为什么选 Kotlin + Spring Boot
🆓 免费文章 | 技术选型篇
独立开发者的后端选型困境
做后端的选择太多了:Java、Kotlin、Python(Django/FastAPI)、Go、Node.js......每个都有拥趸,每个都有道理。
本文不争论「哪个语言最好」,而是从独立开发者做真实产品的角度,解释为什么这套课程选择了 Kotlin + Spring Boot。
Kotlin:Java 的升级版
为什么不用 Java?
Java 能做所有事情,但写起来太啰嗦:
// Java:一个简单的数据类
public class User {
private String id;
private String name;
private Integer age;
public User() {}
public User(String id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
// 还有 toString, equals, hashCode...
}
// Kotlin:同样的功能
data class User(
val id: String,
val name: String,
val age: Int
)
一个 data class 就搞定了,自动生成 getter/setter/toString/equals/hashCode。
Kotlin 的核心优势
1. 空安全
// 编译器强制你处理 null
var name: String = "张三" // 不能为 null
var name: String? = null // 明确声明可为 null
// 安全调用
val length = name?.length // name 为 null 时返回 null,不崩溃
val length = name?.length ?: 0 // null 时返回默认值 0
2. 扩展函数
// 给已有类添加方法,不需要继承
fun String.isValidPhone(): Boolean {
return this.matches(Regex("^1[3-9]\\d{9}$"))
}
// 使用
"13800138000".isValidPhone() // true
3. 协程(异步编程)
// 比 Java 的线程和回调优雅太多
suspend fun fetchUserData(userId: String): User {
return withContext(Dispatchers.IO) {
userRepository.findById(userId)
}
}
4. 与 Java 100% 互操作
Kotlin 编译成 Java 字节码,可以直接用所有 Java 库。Spring Boot、MyBatis、所有 Java 生态全部可用。
Spring Boot:企业级后端标配
为什么选 Spring Boot?
-
生态最完整:数据库、缓存、安全、消息队列,几乎什么都有现成的 Starter
-
AI 非常熟悉:训练数据里有海量 Spring Boot 代码,AI 生成的代码质量很高
-
生产验证充分:全球几百万企业在用,遇到问题网上一定有答案
-
注解驱动,代码简洁:
@RestController
@RequestMapping("/web/attraction")
class AttractionController(
private val attractionService: AttractionService
) {
@PostMapping("/list")
fun getList(@RequestBody params: Map<String, Any>): Result<*> {
return Result.ok(attractionService.getList(params))
}
}
MyBatis-Plus:最适合国内开发者的 ORM
| 特性 | MyBatis-Plus | JPA/Hibernate | MyBatis |
|---|---|---|---|
| 代码生成 | ✅ 一键生成 | ✅ | ❌ |
| 条件构造 | ✅ LambdaWrapper | ⚠️ Criteria API | ❌ 手写 SQL |
| 分页 | ✅ 内置插件 | ⚠️ | ❌ 手写 |
| 灵活 SQL | ✅ 可写 XML | ❌ | ✅ |
| 学习曲线 | 低 | 高 | 中 |
MyBatis-Plus 的代码生成器可以直接生成 Entity、Mapper、Service、Controller:
// 条件查询示例
val wrapper = LambdaQueryWrapper<TownAttractionEntity>()
.eq(TownAttractionEntity::cityId, cityId)
.like(keyword != null, TownAttractionEntity::attName, keyword)
.eq(TownAttractionEntity::flag, 1)
.orderByDesc(TownAttractionEntity::sort)
val page = attractionMapper.selectPage(Page(pageNum, pageSize), wrapper)
比手写 SQL 简洁,又比 JPA 灵活。
技术栈最终选型
后端语言:Kotlin 1.6.10
Web 框架:Spring Boot 2.3.0
ORM:MyBatis-Plus 3.3.2
数据库:MySQL 8.0
缓存:Redis 6.x
连接池:Druid
构建工具:Gradle (Kotlin DSL)
为什么选这些版本?
这是经过生产验证的稳定组合。Spring Boot 2.3.0 虽然不是最新版,但与 Kotlin 1.6.10 的兼容性经过充分验证,AI 对这个版本的熟悉程度也更高。
💡 AI 辅助开发的版本选择原则:选择 AI 训练数据中最丰富的版本,而不一定是最新版本。过于新的版本 AI 可能生成错误代码。
下一篇
F05 → 前端框架选型:Vue 3 + UniApp 的全端覆盖策略
本文为免费文章,转载请注明出处。