Spring Boot入门教程:60分钟快速上手——一个北漂程序员的深夜自救指南

极客小岛
2025-12-16 13:49
阅读 584

上周五晚上11点47分,我瘫在深圳南山区科技园附近那套月租3500的小单间地板上,笔记本电脑屏幕还亮着,终端里红得发烫的报错信息像在嘲笑我。老婆发来微信:“今天又加班到这么晚?你那个Spring Boot项目跑起来没?”我盯着消息看了两分钟,手指悬在键盘上,不知道怎么回。不是没跑起来——是压根连“Hello World”都还没打印出来。

去年十月,我从北京裸辞南下深圳。原因很简单:房贷每月8200,加上孩子奶粉钱和老人医药费,北京那15k的月薪实在撑不住了。HR说“深圳机会多”,面试官画饼说“技术栈全面就能涨薪”。于是我把所有积蓄凑成首付,在龙岗买了个小两居,背上了三十年的债。可现实是,入职新公司三个月,我还在用老旧的SSM框架写CRUD,而组里新来的应届生都在聊Spring Boot、微服务、云原生……我感觉自己像一台还在用Windows XP的电脑,被扔进了全是MacBook Pro的会议室。

那个让我失眠的周末

事情的导火索是一道面试题。

上周三团建吃饭,同事小张(比我小五岁,清华毕业)随口问我:“哥,你要是现在跳槽,能答上来‘Spring Boot自动配置原理’吗?”我愣了一下,筷子停在半空。不是不会,是根本没系统学过。我只会照着公司模板改改配置文件,加个@RestController注解,然后祈祷别出错。

那天晚上回家,我翻遍了简历——“熟悉Java开发”、“了解Spring框架”……全是模糊词。真正能拿得出手的项目?除了几个内部管理系统,连GitHub都空空如也。更扎心的是,我在招聘软件上看到一个岗位要求:“熟练掌握Spring Boot,有Python脚本经验者优先”。而我,连Python只会在爬虫课上print("hello")。

那一刻,焦虑像地铁早高峰的人流一样把我淹没。

我知道不能再拖了。周六早上7点,趁着老婆带孩子去早教班,我泡了杯速溶咖啡(不敢买星巴克,太贵),打开IDEA,新建了一个项目,命名为springboot-60min-rescue——就当是救自己一命。

60分钟,从零到跑通第一个接口

很多人觉得Spring Boot难,其实是因为一上来就被“自动配置”、“Starter”、“内嵌Tomcat”这些词吓住了。但如果你把它当成一个“帮你省事的工具包”,一切就简单了。

第一步:创建项目(5分钟)

我用的是 start.spring.io —— 这个网站简直是懒人福音。选好语言(Java)、Spring Boot版本(我选了最新的3.2.0)、打包方式(jar),然后勾上两个最基础的依赖:

  • Spring Web:让你能写HTTP接口
  • Spring Boot DevTools:改代码不用重启,省时间

点击“Generate”,下载zip包,解压后用IDEA打开。整个过程比点外卖还快。

小插曲:我第一次选了“Lombok”,结果本地没装插件,编译直接报错。折腾了20分钟才搞定。所以新手建议先别贪多,核心依赖够用就行。

第二步:写个Hello World(10分钟)

src/main/java 下新建一个包,比如 com.nanshan.developer(南山区打工人专属包名,懂的都笑)。然后新建一个类:

package com.nanshan.developer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

再新建一个Controller:

package com.nanshan.developer.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, 深圳打工人!";
    }
}

按F5运行(其实是Shift+F10),控制台刷出一堆日志,最后看到:

Tomcat started on port(s): 8080 (http)
Started Application in 2.345 seconds

浏览器打开 http://localhost:8080/hello,页面弹出:“Hello, 深圳打工人!”

那一刻,我居然有点想哭。 不是因为多难,而是终于跨出了第一步。就像当年第一次挤进10号线早高峰地铁,虽然被挤成纸片人,但至少上车了。

第三步:整合数据库(20分钟)

光会返回字符串不够,真实项目都要连数据库。我用H2内存数据库(不用装MySQL,适合学习),加个依赖:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

然后在 application.properties 里加三行:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.h2.console.enabled=true

写个简单的User实体和Repository:

@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String name;
    // getter/setter 略
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {}

再写个接口:

@GetMapping("/users")
public List<User> getAllUsers() {
    return userRepository.findAll();
}

启动后访问 http://localhost:8080/h2-console,还能看到Web版的数据库管理界面。我手动插了两条数据,刷新 /users,JSON数据哗哗出来。

这不就是我们天天写的增删改查吗?原来底层就这么简单。

第四步:对比Python,理解“约定优于配置”(15分钟)

说到Python,我突然想起之前用Flask写API的经历。Flask也很轻量:

from flask import Flask
app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'Hello from Python!'

是不是和Spring Boot很像?都是“定义路由 + 返回内容”。区别在于:

  • Python靠缩进和装饰器,简洁但容易因格式出错;
  • Java靠注解和强类型,啰嗦但结构清晰,适合大型项目。

Spring Boot的核心哲学就是“约定优于配置”——你不用写web.xml,不用配DispatcherServlet,甚至不用管Tomcat怎么启动。它默认知道你要什么,除非你特别说明。

这让我想起深圳的租房市场:中介说“精装交付,拎包入住”,其实就是“约定好了家具家电都有”。你要是非要换地板、拆墙,那就得额外签补充协议(自定义配置)。Spring Boot也是这样——90%的场景用默认就行,剩下10%再动手改。

最后10分钟:打包部署

在pom.xml同级目录执行:

./mvnw clean package

生成一个fat jar(包含所有依赖),然后:

java -jar target/springboot-60min-rescue-0.0.1-SNAPSHOT.jar

服务就跑起来了。这意味着,你可以在任何装了JRE的服务器上一键部署——再也不用手动拷贝一堆lib包,再也不用担心“在我机器上是好的”。

从教程到真实项目:我的综合实践

光看教程不够,我决定把公司一个旧模块重构成Spring Boot。那是个Excel导入功能,原来用POI+Servlet,代码又臭又长。我用Spring Boot + EasyExcel重构,三天搞定,代码量减少60%,还加了异步处理和进度条。

更关键的是,这个小项目成了我简历上的亮点。上周投了一家跨境电商公司,面试官问:“看你用了Spring Boot,能说说自动配置是怎么工作的吗?”

我深吸一口气,回答:

“Spring Boot启动时会加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,里面列出了所有自动配置类。比如DataSourceAutoConfiguration,它会检查classpath有没有HikariCP、有没有spring.datasource.url配置,如果有,就自动创建DataSource Bean。整个过程基于@Conditional条件注解,只有满足条件才会生效。”

面试官眼睛一亮:“不错,理解得很到位。”
最终offer薪资22k,比现在高7k。虽然还不够覆盖房贷,但至少看到了希望。

给同样挣扎的你的建议

  1. 别怕从“Hello World”开始
    我30岁了,还在学基础,丢人吗?不丢人。地铁上刷LeetCode的大叔、凌晨改bug的宝妈,谁不是一边崩溃一边前进?

  2. 把学习嵌入生活缝隙
    我每天通勤2小时(4号线转1号线,早高峰像沙丁鱼罐头),就用手机看Spring文档;午休20分钟,敲几行代码。积少成多。

  3. 用真实需求驱动学习
    别为了学而学。想跳槽?就针对JD里的关键词练。想升职?就把手头项目用新技术重做。技术是工具,不是目的。

  4. 接受“不完美”
    我的第一个Spring Boot项目漏洞百出:没加全局异常处理、没写单元测试、配置文件硬编码……但没关系,先跑起来,再优化。就像我的房贷,不能因为还不清就不还。

写在最后:技术人的尊严

昨天晚上,我又加班到十点。走出写字楼,深圳湾的风吹得人清醒。地铁上,我打开GitHub,给自己的springboot-60min-rescue项目加了个README,写了句:

“献给所有在深夜debug的普通人。代码会报错,但人生不会。”

Spring Boot也好,Python也罢,终究只是我们谋生的工具。真正重要的是,在被生活按在地上摩擦的时候,还能爬起来,敲下一行System.out.println("I'm still here");

房贷还会继续还,地铁还得继续挤。但至少现在,我知道——只要我还愿意学,就永远不会被淘汰。

共勉, fellow coder。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝