请写一篇关于【Spring Boot入门教程:60分钟快速上手】的技术文章。写作风格要求:实践驱动。文章需要涵盖以下关键词:知识库,Stable Diffusion,开发心得。

青山不改需求改
2026-07-12 17:54
阅读 524

凌晨两点半,我在成都的出租屋里,写下了这篇博客

去年十一月的一个周五晚上,成都的夜风已经有点刺骨了。

我坐在天府三街附近那个不到20平米的出租屋里,面前摆着一碗已经坨了的外卖米线,屏幕上是刚收到的offer邮件。月薪从外包的12k涨到了甲方的18k,涨了6000块。

说多不多,说少不少。但对于一个在外包公司摸爬滚打了三年的Java开发来说,这6000块,意味着我终于不用再在简历上写"某大型互联网公司项目驻场开发"了,意味着我终于有了自己的工牌,意味着我终于……不用再在甲方爸爸面前唯唯诺诺了。

老婆在旁边哄孩子睡觉,小声问我:"涨了多少?"

"六千。"

她笑了一下:"够给娃儿多加个奶粉钱了。"

那一刻,我鼻子有点酸。

三年了。从2021年毕业进外包,到2024年跳进甲方,这中间吃了多少苦、加了多少班、背了多少锅,只有我自己知道。但今天,我想跟你聊的,不是那些苦逼的故事,而是我想把自己这三年攒下来的东西,尤其是Spring Boot这块,用一篇文章给你讲明白。

为什么是Spring Boot?因为这是我跳槽面试中被问得最多的,也是我在甲方入职第一周用得最顺手的。

所以,如果你也是一个想入门Spring Boot的兄弟,或者你跟我当年一样,在外包里写着CRUD,想往更深的地方走一走,那这篇60分钟快速上手的教程,可能就是为你写的。


先说说我为什么要写这篇东西

跳进甲方之后,我的工作内容发生了很大变化。

在外包的时候,我基本就是个"代码搬运工"。甲方给需求文档,外包项目经理拆任务,我们照着写。技术栈?不存在的。能用就行,能跑就行,出了bug就重启。

但进了甲方之后,一切都变了。

入职第一天,技术总监把我叫到会议室,指着白板说:"我们这边用的是Spring Boot 3.x,搭配MyBatis-Plus,数据库是MySQL 8.0,缓存用的Redis,消息队列是RabbitMQ。你之前用过这些吗?"

我硬着头皮说:"用过一些,Spring Boot写过项目。"

其实我心里虚得很。我在外包写的那个"Spring Boot项目",说白了就是用了个@SpringBootApplication注解,然后往里面塞了一堆@RestController,连自动配置的原理都没搞明白。

总监看了我一眼,说:"行,那你先熟悉一下代码仓库,下午有个需求评审你旁听一下。"

那天下午的需求评审,我全程像个木头人一样坐在那里,听他们讨论什么"微服务拆分"、"分布式事务"、"链路追踪"……我连很多名词都是第一次听到。

回到工位上,我打开电脑,看着那个庞大的代码仓库,几百个模块,几千个类,一时间竟然不知道从哪里看起。

那种感觉,就像你突然被扔进了一片大海,四周都是浪,你拼命想抓住点什么,但什么都抓不住。

当时真的很焦虑。

晚上回到家,老婆看我脸色不对,问我怎么了。我说:"感觉跟不上。"

她说:"那就学呗,你以前不也是这么过来的。"

对,学呗。


60分钟,从零开始上手Spring Boot

那段时间,我几乎每天下班后都会花两三个小时来补课。我把自己的学习过程整理了一下,发现如果目标明确、方法得当,其实60分钟就足够你跑通Spring Boot的核心流程了。

注意,我说的是"跑通核心流程",不是"精通"。精通需要时间,但入门,真的不需要太久。

下面,我就把自己这60分钟的学习路径分享给你。

前10分钟:搞清楚Spring Boot到底是个啥

很多人一上来就急着写代码,结果写了一堆注解,连Spring Boot是什么都没搞清楚。

Spring Boot不是一个新框架,它是Spring框架的"脚手架"。

你可以这么理解:Spring就像是一堆乐高积木,功能强大但拼装复杂。你需要自己配置XML、自己管理Bean的生命周期、自己搞各种依赖。而Spring Boot呢,就是帮你把最常用的那套积木提前拼好了,你拿过来直接用就行。

它的核心思想就三个字:约定大于配置

举个例子。你要写一个Web应用,用传统Spring的方式,你得配web.xml、配DispatcherServlet、配视图解析器……一堆东西。但在Spring Boot里,你只需要引入一个spring-boot-starter-web依赖,它就自动帮你把这些全配好了。

这就是"约定"——Spring Boot约定你用Tomcat做服务器,约定你用JSON做数据格式,约定你用8080端口……如果你不满意,可以改,但大多数时候,默认的就够用了。

记住这个概念,后面你会反复体会到它的好处。

10-25分钟:搭建你的第一个项目

好,概念清楚了,接下来动手。

打开你的IDEA(我用的是2024.1版本),新建一个项目,选择Spring Initializr。这一步跟你在网上看到的教程应该差不多,我就不啰嗦了。重点说几个容易踩坑的地方:

第一,版本选择。

Spring Boot的版本迭代很快。我写这篇文章的时候,最新的稳定版是3.2.x。但如果你是新手,我建议你先用3.1.x,因为3.2.x对JDK的要求是17+,而很多公司的老项目还在用JDK 8或11。

第二,依赖选择。

初学者只需要勾选这几个就够了:

  • Spring Web(Web开发必备)
  • Lombok(减少样板代码,谁用谁知道)
  • MySQL Driver(数据库驱动)
  • Spring Data JPA(或者MyBatis,看你们公司用啥)

其他的,等你需要的时候再加。别一上来就勾选一堆,到时候项目启动慢不说,出了问题你都不知道是哪个依赖引起的。

第三,项目结构。

Spring Boot的项目结构很简洁,核心就几个目录:

src/
├── main/
│   ├── java/
│   │   └── com/example/demo/
│   │       └── DemoApplication.java  // 启动类
│   ├── resources/
│   │   ├── application.yml            // 配置文件
│   │   └── static/                    // 静态资源
│   └── templates/                     // 模板文件
└── test/                              // 测试代码

这里我要特别说一下application.yml这个文件。在外包的时候,我们项目里用的是application.properties,但进了甲方之后,发现大家都用.yml格式。

为什么?因为yml的层级结构更清晰。举个例子:

server:
  port: 8080
  servlet:
    context-path: /api

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

对比properties格式:

server.port=8080
server.servlet.context-path=/api
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

是不是一目了然?yml的层级关系让你一眼就能看出配置的归属,而properties格式全靠前缀来区分,配置多了之后看着就头疼。

这个小细节,是我进甲方之后学到的第一个"规范"。

25-40分钟:写你的第一个接口

项目搭好了,接下来写代码。

我们先写一个简单的用户管理接口。别觉得简单,很多基础的东西,你不在实践中摸一遍,永远理解不透彻。

第一步,写实体类:

@Data
@Entity
@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String username;
    
    private String email;
    
    private LocalDateTime createTime;
}

这里用了JPA的注解。@Data是Lombok的,自动生成getter/setter/toString等方法。@Entity告诉JPA这是一个数据库实体,@Table指定对应的表名。

第二步,写Repository:

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByUsername(String username);
}

就这一行代码,你就拥有了增删改查的能力。没看错,就一行。这就是Spring Data JPA的魔力——它根据方法名自动生成SQL。findByUsername会被解析成SELECT * FROM t_user WHERE username = ?

我第一次看到这个的时候,惊了。在外包的时候,这些SQL可都是我一个一个手写的啊。

第三步,写Service:

@Service
@RequiredArgsConstructor
public class UserService {
    
    private final UserRepository userRepository;
    
    public User createUser(String username, String email) {
        User user = new User();
        user.setUsername(username);
        user.setEmail(email);
        user.setCreateTime(LocalDateTime.now());
        return userRepository.save(user);
    }
    
    public List<User> getUsers() {
        return userRepository.findAll();
    }
}

注意这里的@RequiredArgsConstructor。这是Lombok的注解,配合final字段,自动生成构造器注入。这样你就不需要写@Autowired了。

为什么推荐构造器注入而不是字段注入?

这是我进甲方后,代码review时被组长纠正的第一个习惯。字段注入(就是直接在字段上打@Autowired)有几个问题:

  1. 无法保证依赖不可变(字段不是final的)
  2. 隐藏了依赖关系(你不知道这个类到底依赖了什么)
  3. 单元测试不方便(没法通过构造器传入mock对象)

这些细节,在外包的时候没人教你,因为外包的目标是"快",不是"好"。

第四步,写Controller:

@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
    
    private final UserService userService;
    
    @PostMapping
    public User createUser(@RequestBody Map<String, String> params) {
        return userService.createUser(
            params.get("username"), 
            params.get("email")
        );
    }
    
    @GetMapping
    public List<User> getUsers() {
        return userService.getUsers();
    }
}

到这里,启动项目,用Postman或者curl测试一下:

# 创建用户
curl -X POST http://localhost:8080/users \
  -H "Content-Type: application/json" \
  -d '{"username":"zhangsan","email":"zhangsan@example.com"}'

# 查询用户
curl http://localhost:8080/users

如果返回了JSON数据,恭喜你,你的第一个Spring Boot接口就跑通了。

40-50分钟:理解自动配置原理

接口跑通了,但如果你只停留在"会用"的层面,那你跟在外包写CRUD没什么区别。

所以,接下来这10分钟,我们要搞明白一个核心问题:Spring Boot是怎么做到"开箱即用"的?

答案就是:自动配置(Auto-Configuration)。

当你引入spring-boot-starter-web的时候,Spring Boot会做以下事情:

  1. 自动配置Tomcat作为内嵌服务器
  2. 自动配置DispatcherServlet处理请求
  3. 自动配置Jackson做JSON序列化
  4. 自动配置字符编码过滤器
  5. ……

这些配置都定义在各个@Configuration类中,通过spring.factories文件(Spring Boot 2.x)或org.springframework.boot.autoconfigure.AutoConfiguration.imports文件(Spring Boot 3.x)注册到容器中。

你可以通过在application.yml中加上这行配置来查看所有的自动配置报告:

debug: true

启动后,控制台会打印出哪些自动配置生效了,哪些没有生效,以及为什么。

理解这个机制,你才能真正掌控Spring Boot,而不是被它牵着走。

50-60分钟:跑通一个完整的小项目

最后10分钟,我建议你做一件事:把上面写的代码,扩展成一个完整的小项目。

包括:

  • 全局异常处理(@ControllerAdvice
  • 统一返回格式(封装一个Result<T>类)
  • 参数校验(@Valid + @NotBlank等注解)
  • 简单的日志(用@Slf4j注解)

这些东西加在一起,就是一个生产级别的项目骨架了。


从Spring Boot说起,聊聊我这三年

好了,技术部分讲完了。但我想借这个机会,跟你聊聊我这三年的一些感悟。

外包教会我的事

说实话,外包的日子虽然苦,但也教会了我一些东西。

第一,快速学习的能力。

外包的项目换得勤,可能这个月还在写电商系统,下个月就去做政务平台了。技术栈也不一样,今天用Spring Cloud,明天可能就用Dubbo了。逼得你必须快速上手,快速产出。

这种能力,在我跳进甲方之后,帮了大忙。入职第一周,我就把公司的代码仓库看了个大概,第二周就开始接需求了。

第二,抗压能力。

外包的甲方爸爸,那真的是……算了,不说了,说多了都是泪。

有一次,甲方要求周五下班前必须上线一个功能,但那个功能涉及到三个系统的联调。我、另外两个外包兄弟,加上甲方的一个技术,四个人从下午两点开始联调,一直搞到晚上十一点。

中间还出了个生产事故,甲方那边直接打电话过来骂人。我一边排查问题,一边听着电话那头的咆哮,手都在抖。

但最后,功能还是准时上线了。

那种在极端压力下把问题解决掉的成就感,是真的爽。

甲方教会我的事

跳进甲方之后,我发现这里跟外包最大的区别,不是技术,而是思维方式

在外包,你的目标是"把功能做出来"。但在甲方,你的目标是"把系统做好"。

这两个目标听起来差不多,但实际上差别很大。

"把功能做出来",意味着你只需要关注当前的需求,能跑就行。

"把系统做好",意味着你要考虑可扩展性、可维护性、性能、安全……你要写的不是"能用的代码",而是"好的代码"。

举个例子。我在甲方写的第一个接口,被组长review的时候,指出了十几个问题:

  • 为什么这里用HashMap而不是ConcurrentHashMap
  • 这个SQL有没有加索引?
  • 这个异常为什么要catch?catch了之后为什么不打日志?
  • 这个接口的幂等性怎么保证?
  • ……

我当时就懵了。这些问题,在外包的时候,从来没有人问过。

但也正是从那时候开始,我才真正理解了什么叫"工程化思维"。

关于知识库

说到这里,我想聊聊知识库这个东西。

进甲方之后,公司有一个内部的知识库系统,类似于Confluence。里面记录了各种技术方案、架构设计、踩坑记录……

我第一次打开的时候,就被震住了。里面有一篇关于Spring Boot自动配置原理的文章,写了将近两万字,从源码层面分析了整个流程。还有一篇关于分布式事务的文章,把Seata的AT、TCC、Saga三种模式讲得明明白白。

这些东西,在外包的时候,我是接触不到的。

从那以后,我也养成了记录的习惯。每解决一个问题,每学到一个新的知识点,我都会写到知识库里。

不是为了给谁看,而是为了给自己留个底。

人的记忆是不可靠的。你今天搞明白的东西,三个月后可能就忘了。但如果你写下来了,下次再遇到的时候,翻一翻就能想起来。

而且,写东西的过程,本身就是一个深度学习的过程。你以为你懂了,但当你试图把它写出来的时候,你会发现很多细节你其实没搞清楚。

所以,如果你也想提升自己,我强烈建议你开始写技术博客,或者维护自己的知识库。

不用写得多好,也不用追求什么阅读量。就当成是自己的学习笔记,日积月累,你会发现自己进步了很多。

关于Stable Diffusion

你可能觉得奇怪,一个Java开发,怎么聊起Stable Diffusion了?

事情是这样的。

今年年初,公司接了一个AI相关的项目,需要在系统里集成图片生成的能力。当时团队里没有人懂这块,领导说让我来调研一下。

我花了一周时间,研究了Stable Diffusion的原理和部署方式。简单来说,Stable Diffusion是一个开源的文本生成图片模型,可以通过输入一段文字描述,生成对应的图片。

部署的方式有很多种,最简单的是用Python + Diffusers库,但如果要集成到Java系统里,就需要做一些额外的工作。

最后我们的方案是:用Python起一个Stable Diffusion的服务,暴露HTTP接口,然后Java端通过RestTemplate去调用。

@Service
public class ImageGenerationService {
    
    @Value("${sd.api.url}")
    private String sdApiUrl;
    
    private final RestTemplate restTemplate;
    
    public String generateImage(String prompt) {
        Map<String, String> request = new HashMap<>();
        request.put("prompt", prompt);
        request.put("steps", "20");
        request.put("width", "512");
        request.put("height", "512");
        
        ResponseEntity<Map> response = restTemplate.postForEntity(
            sdApiUrl + "/generate", 
            request, 
            Map.class
        );
        
        return (String) response.getBody().get("image_url");
    }
}

这个过程中,我学到了很多关于AI部署、模型推理、GPU调度的知识。虽然这些不是Java开发的核心技能,但在如今这个AI时代,了解一些AI相关的技术,对你的职业发展是有好处的。

技术人的竞争力,不在于你掌握了多少门语言,而在于你解决问题的能力。

开发心得:给还在外包的兄弟

最后,我想给还在外包的兄弟说几句心里话。

第一,不要放弃学习。

外包的工作确实很消耗人。每天加班,写CRUD,没有时间提升自己。但你不能因此就放弃学习。

我当年在外包的时候,每天通勤单程一个小时。我就利用这一个小时,在地铁上看技术书、听技术播客。晚上回到家,再花一个小时写代码、看源码。

周末的时候,我会去图书馆,一待就是一整天。

这些时间,都是我从生活里"偷"出来的。

第二,要有目标。

不要为了学习而学习。你要想清楚,你想去哪里,然后有针对性地学习。

我当时的目标很明确:跳进甲方,做真正的技术。所以我重点学习了Spring Boot的原理、微服务架构、数据库优化这些甲方面试常问的内容。

第三,不要怕失败。

我跳槽的时候,面了七八家公司,被拒了好几次。有一次,面试官问了一个关于Spring事务传播机制的问题,我答不上来,当场就凉了。

回家之后,我花了整整一个晚上,把Spring事务的七种传播机制搞了个明明白白,还写了一篇博客记录下来。

失败不可怕,可怕的是你失败了还不长记性。

第四,珍惜身边的人。

这三年,最辛苦的不是我,是我老婆。

她一个人带孩子,一个人做家务,还要忍受我时不时的情绪低落。有时候我加班到深夜回家,她已经在沙发上睡着了,桌上给我留着饭菜。

如果没有她的支持,我不可能走到今天。


写在最后

写这篇文章的时候,是周六的下午。

孩子在旁边玩积木,老婆在厨房做饭,阳光从窗户照进来,洒在键盘上。

我想起三年前的自己,刚毕业,满腔热血,以为进了外包就能大展拳脚。结果现实给了我一记重拳——外包的日子,远比我想象的艰难。

但现在回头看,那些艰难的日子,反而成了我最宝贵的财富。

因为正是那些日子,教会了我什么是坚持,什么是责任,什么是真正的技术追求。

Spring Boot只是一个小切口,但透过它,我想告诉你的是:技术这条路,没有捷径。你需要一行一行地写代码,一个一个地解决问题,一天一天地积累。

但只要你坚持走下去,总有一天,你会发现自己已经站在了一个不一样的高度。

共勉。


P.S. 如果你也是成都的程序员,欢迎来找我交流。我每个月会在天府三街附近的咖啡馆组织一次小型的技术分享会,不收费,就是大家坐在一起聊聊技术、吐吐槽。有兴趣的兄弟可以私信我。

P.P.S. 这篇文章里提到的代码,我已经整理成了一个完整的GitHub仓库,包括全局异常处理、统一返回格式、参数校验等最佳实践。需要的兄弟可以评论留言,我把链接发给你。


成都,2024年某个普通的周六下午 一个从外包跳进甲方的Java开发

评论 0

最热最新
暂无评论
青山不改需求改Lv.1
0
影响力
0
文章
0
粉丝