Spring Boot入门教程:60分钟快速上手
大家好,我是老K,一个远程办公的独立开发者。Vim党,不装IDE,终端开三个tmux窗格就能打一天。在当前这个“敏捷得像在跑马拉松”的小团队里,已经吭哧吭哧干了快两年。平时喜欢折腾Rust、Go、Nix这些新玩意儿,但一到公司项目——稳字当头,Java + Spring Boot 依然是我们的主力栈。
上周五晚上11点,产品又甩过来一个紧急需求:“双11大促前要上线一个轻量级营销活动后台,下周三必须交付”。我盯着屏幕,默默喝了口凉掉的咖啡,心里一万只羊驼奔腾而过。产品经理说“很简单,就几个表单+列表页”,但我知道,这背后又是CRUD地狱 + 权限校验 + 日志审计 + 防刷接口的组合拳。
没办法,为了简历上能多写一行“主导高并发营销系统开发”(其实就5个API),只能硬着头皮上。好在Spring Boot这几年越做越成熟,60分钟搭个骨架完全可行。今天这篇水文,就当是给和我一样被deadline追着跑的孤独开发者们,留个速查笔记。
为什么又是Spring Boot?
别杠,我知道你在想:“现在不是都转Go了吗?”
确实,我私底下用Go写了好几个side project,简洁、编译快、部署爽。但在企业级产品中,尤其是涉及复杂事务、权限体系、审计追踪的场景,Spring生态的成熟度还是碾压级别的。比如我们这次的需求,光是“操作日志自动记录”这一条,用Spring AOP + JPA Auditing 20行代码搞定;换成Go?你得自己造轮子,或者引入一堆第三方库,还得担心兼容性。
而且——现实点说,跳槽时写“精通Spring Cloud”比“会写Go Web”更容易过HR筛简历。虽然有点扎心,但这就是现状。
60分钟极速搭建:从零到可跑
第一步:初始化(5分钟)
打开 start.spring.io,选好版本(建议2.7.x或3.x,别贪新),勾上:
- Spring Web
- Spring Data JPA
- H2 Database(开发用,后面换MySQL)
- Lombok(省掉getter/setter,Vim党表示真香)
- Validation(参数校验不能少)
生成后解压,cd进去,./mvnw spring-boot:run —— 如果看到Tomcat启动日志,恭喜,你已经跑起来了。
⚠️ 安全提醒:别把H2控制台开在生产环境!默认路径是
/h2-console,曾经有同事线上开了这个,结果被扫描到直接拖库。血泪教训。
第二步:写个Hello World接口(10分钟)
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "stranger") String name) {
return "Hello, " + name + "! You're safe (for now).";
}
}
curl一下:
$ curl "localhost:8080/hello?name=K"
Hello, K! You're safe (for now).
看起来平平无奇?但注意那个@RequestParam——如果用户传了个超长字符串或者特殊字符,会不会导致内存溢出或XSS?所以在真实产品中,我会加上:
@Size(max = 50, message = "Name too long!")
安全不是加个WAF就行,得从接口设计就开始防御。
第三步:连数据库,建实体(15分钟)
假设我们要存“活动配置”:
@Entity
@Table(name = "promo_activity")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PromoActivity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 100)
private String title;
@NotNull
private LocalDateTime startTime;
@NotNull
private LocalDateTime endTime;
// 安全字段:谁创建的,防内部越权
@Column(nullable = false)
private String createdBy;
}
Repository 就一行:
public interface PromoActivityRepository extends JpaRepository<PromoActivity, Long> {}
然后写个Service,注入Repository,再套一层Controller。经典三层架构,老但稳。
🤯 踩坑实录:上周我忘了给
createdBy加非空约束,测试同学用Postman传了个null,结果数据库插进去了。上线前被安全扫描工具揪出来,差点背锅。从此以后,所有用户关联字段必加@NotNull+ 数据库NOT NULL。
第四步:配置与安全加固(20分钟)
application.yml 是灵魂:
spring:
datasource:
url: jdbc:mysql://prod-db:3306/marketing?useSSL=false&serverTimezone=UTC
username: ${DB_USER} # 别写死!用环境变量
password: ${DB_PASS}
jpa:
hibernate:
ddl-auto: validate # 生产环境绝对不能是 create 或 update!
show-sql: false # 别打印SQL,防止敏感信息泄露
server:
port: 8080
error:
include-message: never # 别把异常堆栈暴露给前端
management:
endpoints:
enabled-by-default: false # 关闭Actuator默认端点
关键点:
- 数据库连接用环境变量:Docker/K8s部署时动态注入,避免代码里硬编码密码。
- ddl-auto 设为 validate:确保实体类和表结构一致,不自动改表,防止误删字段。
- 关掉Actuator公开端点:曾经有团队把
/actuator/env暴露在外网,直接泄露数据库密码。
第五步:打包 & 部署(10分钟)
./mvnw clean package -DskipTests
生成的target/*.jar就是fat jar,自带Tomcat,直接运行:
java -jar app.jar --spring.profiles.active=prod
配合一个简单的Dockerfile:
FROM openjdk:17-jdk-slim
COPY target/app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
推到私有镜像仓库,K8s拉起——搞定。
Go vs Spring Boot:我的真实感受
| 维度 | Go | Spring Boot |
|---|---|---|
| 启动速度 | 毫秒级 | 秒级(但可接受) |
| 内存占用 | 极低(~20MB) | 较高(~300MB+) |
| 生态成熟度 | Web框架多但碎片化 | Spring全家桶,开箱即用 |
| 安全组件 | 需自行集成 | Spring Security 一整套方案 |
| 团队协作 | 简单项目快 | 复杂业务更清晰 |
说真的,如果是做一个高并发、低延迟的微服务(比如支付回调),我会毫不犹豫选Go。但如果是带后台管理、审批流、多租户的产品——Spring Boot 的约定优于配置、AOP、事务管理、Security,真的省心太多。
最后一点开发心得
远程办公两年,最大的感悟是:代码不仅是给机器跑的,更是给人看的。尤其是在没有面对面沟通的情况下,清晰的接口文档、合理的包结构、完善的日志(带traceId!)、严格的参数校验,都是对队友最基本的尊重。
别为了“快”而牺牲安全性和可维护性。你今天省下的10分钟,可能变成线上事故后通宵的10小时。
好了,60分钟到了。我的营销后台也刚好跑起来了。虽然界面丑得像90年代,但至少——它安全、稳定、能扛住双11。
下次再被产品逼需求,希望你能笑着打开Spring Initializr。
Peace.

评论 0