news 2026/10/11 6:45:00

Spring Boot零基础实战:从自动配置原理到第一个API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot零基础实战:从自动配置原理到第一个API

这年头学 Java 后端,绕不开 Spring Boot 这个名字。但奇怪的是,网上越是热门的东西,对小白反而越不友好——要么上来就甩一段配置让人摸不着头脑,要么直接把自动配置当成黑盒一笔带过,仿佛看不懂原理是理所当然的。我自己当年从 SSH 那一代摸爬滚打过来,太清楚那种“代码能跑但完全不知道为什么能跑”的焦虑感了。所以这篇东西,我想换个写法,不堆术语,不装高深,就站在一个真·零基础的视角,把 Spring Boot 从环境准备到写出一个像样的 API,再到认知它背后的运行逻辑,整条链路掰开了讲清楚。你看完不用记住所有源码细节,但心里得有个谱:它到底解决了什么问题、一个请求进来之后经历了什么、以及你自己改配置时到底在改什么。

这篇指南适合这几类人看:刚开始学 Java 但还没碰过 Web 框架的同学;被 SSM、XML 配置折磨到怀疑人生的自学者;以及想快速搭一个后端 API 去交课程设计或者练手项目的朋友。按照下面的步骤走下来,你应该能独立完成一个带数据库的增删改查接口,并且知道怎么把项目打包成能直接运行的 jar 包。过程会踩到一些坑,我也会把高频问题一并列出来,省得你再去搜索引擎里大海捞针。

1. Spring Boot 到底帮你省掉了什么:从配置地狱到约定优于配置

要理解 Spring Boot 的价值,得先知道它前面那个 Spring 框架当年有多折腾人。Spring 本身解决的是 Java 企业开发里对象管理、解耦和事务控制这些核心问题,这个方向没有任何问题——问题出在它早期的使用成本上。在 Spring Boot 诞生之前,写一个 Web 项目你要面对一摞 XML 配置文件:数据源要配、事务管理器要配、视图解析器要配、包扫描要配,稍有差错启动就报错,而且报错信息往往驴唇不对马嘴。更折磨人的是不同模块的版本兼容矩阵,Spring 和 Hibernate 要匹配、Hibernate 和 MySQL 驱动要匹配,一个版本对上不,整条链就崩给你看。

Spring Boot 做的事情,可以粗暴理解为“把 Spring 家电装进了一个随插随用的排插里”。它有两个核心大招:

第一个大招叫起步依赖(Starter)。你想用 Web 能力,不用再手动拉十几个 jar 并祈祷版本兼容,只要引入一个spring-boot-starter-web,它会把嵌入式 Tomcat、Spring MVC、Jackson 序列化这些组件按经过验证的组合一起拉下来。这就好比装修公司给的“全屋套餐”,不用你自己去建材市场单买瓷砖、水泥、电线再来回比对型号。

第二个大招叫自动配置(AutoConfiguration)。Spring Boot 会在启动时扫描类路径下的依赖,你引入了数据库相关的 starter,它检测到类路径里存在数据源驱动和 JPA 类,就自动帮你创建数据源 Bean、配置事务管理器;你引入了spring-boot-starter-web,就自动帮你配置内嵌 Tomcat 和 Spring MVC 的核心组件。大多数情况下,你只需要在application.yml里写上数据库地址、用户名密码,连接池就自己排好了。

这套理念官方术语叫“约定优于配置”。什么意思呢?就是框架作者替你做了一堆合理假设:约定静态资源放在static目录、模板放在templates目录、主启动类放在根包下、Controller 返回字符串走视图解析器。只要你遵循约定,几乎不需要显式配置。如果你偏要打破约定,它也留了后门,用自定义配置覆盖默认行为即可。

和传统 SSM 对比一下,工作量差异很明显:

对比项传统 SSM 手工搭建Spring Boot
引入依赖手动维护十几个 jar 的版本一个 starter 搞定一组依赖
XML 配置web.xml、spring-mvc.xml、spring-mybatis.xml大多数场景零 XML
内嵌服务器单独安装 Tomcat 并做部署配置内嵌 Tomcat,直接运行 main 即可
数据库配置手动配数据源和事务引入 starter 后自动装配
打包部署war 包丢进外部 Tomcatjar 包直接java -jar运行

从结果上看,Spring Boot 并没有发明什么全新的编程模型,它还是建立在 Spring 的 IoC 和 AOP 上的,Controller 写法、Service 分层思想,前后代基本一致。它的意义在于把“上手成本”砍掉了九成,让初学者能在一上午之内跑起第一个接口,把精力花在业务逻辑而不是版本地狱里。想明白了这一层,再往后看原理就不会觉得它玄学了。

2. 动手前先把环境砸瓷实:JDK、Maven、IDEA 的选型建议

网上教程大多默认你已经装好了环境直接开写代码,但现实中我见过太多人卡在第一步——JDK 装了但版本不对,Maven 配了半天镜像源一直超时,IDEA 不知道下载哪个版本。所以这一节我不讲虚的,直接给一套我验证过的建议方案,并解释为什么这么选。

2.1 选择哪一代 JDK:从版本兼容角度反推

JDK 的选择直接影响后续依赖版本。目前国内主流开发环境大致分两派:老项目还在用 JDK 8,新项目普遍踩在 17 或者 21 上。给小白的第一建议是别再走 JDK 8 了,直接用 JDK 17。为什么?因为 Spring Boot 3.x 系列最低要求就是 JDK 17,而 3.x 已是当前的主线版本,连官方的示例代码都默认跑在 3.x 上。如果你装 JDK 8,很多新特性的教程和依赖版本对不上,还得回头找基于 Spring Boot 2.7 的资料,等于自缚手脚。

不过也要提醒一句:如果后续实习或者进公司维护老系统,大概率会遇到 JDK 8 + Spring Boot 2.x 的组合,那时候不要慌,核心概念完全一致,无非是配置写法略有差异。学习期用 17 起步,工作中遇到老项目再按需切换即可。安装 JDK 时注意区分 x64 和 ARM 版本,Windows 用户认准 x64 Installer 一般不会错。

2.2 构建工具用 Maven 还是 Gradle

对纯新手来说,我更推荐先把 Maven 用熟。理由很简单:国内绝大多数公司的 Java 后端项目用 Maven 的比例远高于 Gradle,而且 Spring Boot 的官方文档和大多数教程都以 Maven 示例为主线。Maven 的核心是pom.xml,生命周期就几板斧——clean清理、compile编译、test测试、package打包,理解起来不费劲。Gradle 更灵活更快,但对新手来说它的脚本语法反而多了一层认知负担。

装好 Maven 之后,务必把中央仓库地址换成国内镜像。这一步非常重要,否则你可能在下载依赖这一步就卡半小时,直接消磨掉学习热情。打开 Maven 安装目录下conf/settings.xml,在mirrors节点里加一段镜像配置:

<mirror> <id>aliyun-public</id> <mirrorOf>central</mirrorOf> <name>Aliyun Public Repository</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>

加好之后,在命令行输入mvn -v能正常输出版本号,就说明环境基本通了。这一步不要跳过,后续每个新项目都要依赖 Maven 拉取大量依赖,镜像源直接影响你的耐心。

2.3 IDEA 选型:社区版就够用,能免则免

IDE 上我推荐 IntelliJ IDEA 社区版(Community Edition),理由不是别的,就是免费且功能完全够用。网上总有人推荐破解版,新手没必要冒这个风险。社区版对 Spring Boot 开发唯一的短板是缺少 Spring 相关的一些可视化向导,比如新建项目时不能直接在向导里选 Spring Boot 版本和依赖,但这完全可以用官方脚手架站点弥补,后面会有说明。等以后进阶到需要频繁调试 Spring 相关配置时,再考虑付费版本也不迟。

打开 IDEA 后,记得把 JDK 版本和 Maven 设置配对。具体位置在Settings -> Build, Execution, Deployment -> Build Tools -> Maven,这里要指定 Maven home path 为你自己安装的 Maven 目录,而不是 IDEA 自带的 Maven,以及对应的 settings.xml 路径。这一步不做,你之后在 IDEA 里新建 Spring Boot 项目时可能又会走默认源,下载依旧慢得让人抓狂。

3. 三个注解和一种机制:读懂 Spring Boot 的启动核心

环境搞定之后先别急着堆代码,我建议你花半小时把 Spring Boot 的“开关机原理”大概看明白。这个东西不难,但能解释你日后遇到的大半疑惑:为什么这个 Bean 不用 new 就能直接用?为什么加个依赖功能就出现了?为什么改端口只要一行配置?

3.1 @SpringBootApplication:一个顶三个的组合注解

新建 Spring Boot 项目后,启动类上都有一个@SpringBootApplication。它实际上是一个组合注解,由三个更基础的注解拼起来:

  • @SpringBootConfiguration:标记这是 Spring Boot 的配置类,底层就是 Spring 的@Configuration,配上@Bean方法就能向容器注册对象。
  • @EnableAutoConfiguration:自动配置的开关。框架读取内部各个自动配置类,开启按条件装载 Bean 的流程。
  • @ComponentScan:组件扫描。启动类所在包及其子包下的@Controller、@Service、@Repository、@Component都会被扫描进容器,变成可注入的对象。

所以你在写 Controller 时不需要new UserController(),加了@RestController注解并放在启动类的子包里,容器就会替你管理它的生命周期。这也是为什么官方建议把启动类放在根包——放错位置扫不到,接口就会 404,这是新手经常遇到的坑。

3.2 自动配置的底层:条件装配是怎么“猜”出来的

如果说 Spring Boot 只能记住一个核心机制,那就是条件装配。之前说它检测到 jar 就自动配置,底层靠的是@ConditionalXxx系列条件注解。举个例子,spring-boot-starter-web引入后,类路径上出现了DispatcherServlet相关类,自动配置类WebMvcAutoConfiguration里的@ConditionalOnClass条件成立,于是框架就去创建 Spring MVC 的核心组件、配置静态资源映射、注册内嵌 Tomcat。反过来,如果项目里根本没有 Web 依赖,这一整坨配置直接跳过,不会报错。

这个机制可以用一个场景类比:你家装修公司有个“全屋套餐清单”,里面有水电方案、瓷砖方案、软装方案。工人进场后先看厨房里有没有装烟机的预留管线,有才施工;没有,就在清单上打个叉跳过。Spring Boot 的自动配置类就是这份清单,类路径里存在什么,就决定哪几页方案生效。这比手写几百行 XML 去声明“我要用 MVC、我要用 JSON 转换器”智能太多了。

把眼光放远一点,理解了条件装配,后面你引入 Spring Security、MyBatis,看到别人写的自定义自动配置类时,就不会觉得那是一本天书。它无非是:定义若干个带条件的配置类,在条件成立时组装一组 Bean 放入容器。

3.3 从请求到响应:一个 GET 请求在 Spring Boot 里的旅程

为了把这些概念串起来,我们追踪一个最简单的请求路径。你在浏览器访问http://localhost:8080/hello:

  1. 内嵌在应用里的 Tomcat 接收到 HTTP 请求,交给 Spring MVC 的前端控制器DispatcherServlet。
  2. DispatcherServlet借助处理映射器,找到匹配的HelloController里的方法,这一步依赖方法上的@GetMapping("/hello")注解完成路由匹配。
  3. DispatcherServlet调用你写好的 Controller 方法,方法执行完返回一个字符串。
  4. Spring MVC 借助消息转换器把结果转成 JSON 或纯文本,通过 Tomcat 的响应链路写回浏览器。

这一条链路里,Tomcat 是内嵌的,DispatcherServlet是自动配置创建的,路由映射是你用注解声明的,消息转换器是自动配置装的。每一环都能拿出来单独深入,但初学阶段你只要把顺序记住,就算出问题了,你也大概知道该往哪一层去排查。

4. 写一个能跑的待办事项 API:从建项目到打包部署的完整过程

理论说再多,不如跑通一个真实接口。下面我用一个极简的“待办事项管理”来走完整流程。你不用照着抄也行,但建议亲自敲一遍,尤其是手写pom.xml和分层代码的过程,体会和复制粘贴是完全不一样的。

4.1 用一个在线脚手架快速创建项目

IDEA 社区版不带 Spring Boot 项目向导,所以推荐用官方脚手架网站生成项目。打开浏览器访问 Spring Initializr 站点,左侧表单里做如下选择:

  • Project:Maven
  • Language:Java
  • Spring Boot:选择最新的稳定版本(页面默认给的通常即可)
  • Group:随便填,比如com.example
  • Artifact:填todo-api
  • Dependencies:这次先勾选 Spring Web 和 Spring Data JPA,数据库后面再选

填完点 Generate,下载一个 zip 包,解压后用 IDEA 以 Maven 项目方式打开。首次打开时 IDEA 会读取pom.xml,配合之前换好的镜像源,几分钟内依赖就全部拉齐。如果构建工具里的依赖一直转圈不动,优先检查 settings.xml 的镜像配置是否生效,而不是反复 reload 项目。

4.2 画清楚三层结构:Controller、Service、Repository 各司其职

初学者容易把所有业务代码一股脑塞进 Controller,图省事但项目一复杂就崩。这里做一个最基本的约定,后面所有项目都该遵循:Controller层只负责接收请求和返回响应,不对数据真实性做判断;Service层写核心业务逻辑,比如校验参数、组织数据;Repository层专门跟数据库打交道。数据流转大概是 Controller 收到请求,传给 Service,Service 调 Repository 操作数据库,查询完的数据再逆着传回来。

对应到我们的待办事项项目,目录结构长这样:

src/main/java/com/example/todoapi ├── TodoApiApplication.java ├── controller │ └── TodoController.java ├── service │ └── TodoService.java ├── repository │ └── TodoRepository.java └── entity └── Todo.java

4.3 定义实体和 Repository:一张数据库表对应一个 Java 类

先写一个简单的待办实体,它最终会映射到数据库里的todo表:

package com.example.todoapi.entity; import jakarta.persistence.*; @Entity @Table(name = "todo") public class Todo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private Boolean completed; // JPA 规范要求提供无参构造 public Todo() { } // getter / setter 省略,IDE 可以自动生成 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Boolean getCompleted() { return completed; } public void setCompleted(Boolean completed) { this.completed = completed; } }

@Entity告诉 JPA 这是一个要持久化的对象,@Table(name = "todo")指定表名,@GeneratedValue让主键自增。这一套注解是 JPA 的标准玩法,Spring Data JPA 启动时会根据实体类自动建表,你不用写建表 SQL。

Repository 接口继承JpaRepository,泛型第一参数是实体类型,第二参数是主键类型:

package com.example.todoapi.repository; import com.example.todoapi.entity.Todo; import org.springframework.data.jpa.repository.JpaRepository; public interface TodoRepository extends JpaRepository<Todo, Long> { }

这个接口神奇之处在于,你只是声明了一个接口,Spring Data JPA 会在运行时动态生成实现类,内置了findAll()、findById()、save()、deleteById()等常用数据库方法。按照方法命名规则,你还能不写一行 SQL 就扩展查询,比如findByCompletedTrue()表示查所有已完成的事项。

4.4 Service 和 Controller 写完,接口就活了

Service 层做一层薄薄的封装,简单项目可以直接转发 Repository 的方法,但复杂业务都会在这里扩展:

package com.example.todoapi.service; import com.example.todoapi.entity.Todo; import com.example.todoapi.repository.TodoRepository; import org.springframework.stereotype.Service; import java.util.List; @Service public class TodoService { private final TodoRepository todoRepository; public TodoService(TodoRepository todoRepository) { this.todoRepository = todoRepository; } public List<Todo> getAllTodos() { return todoRepository.findAll(); } public Todo saveTodo(Todo todo) { return todoRepository.save(todo); } }

这里构造函数参数上不用加任何注解,Spring 会按类型自动注入 TodoRepository,因为它是容器里的 Bean。Controller 写法如下:

package com.example.todoapi.controller; import com.example.todoapi.entity.Todo; import com.example.todoapi.service.TodoService; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/todos") public class TodoController { private final TodoService todoService; public TodoController(TodoService todoService) { this.todoService = todoService; } @GetMapping public List<Todo> getTodos() { return todoService.getAllTodos(); } @PostMapping public Todo createTodo(@RequestBody Todo todo) { // 简单校验:标题不能为空 if (todo.getTitle() == null || todo.getTitle().isBlank()) { throw new IllegalArgumentException("标题不能为空"); } return todoService.saveTodo(todo); } }

@RestController让类的每个方法默认以 JSON 形式响应。@RequestBody把前端传来的 JSON 自动转成 Todo 对象,@GetMapping和@PostMapping分别对应查询和新增两组接口。到这里为止,一个收数据、写逻辑、落数据库的最小闭环已经成立了。

4.5 配置 MySQL 并跑起来

容忍 H2 内存数据库做体验是可以的,但它重启就丢数据,不符合大多数真实项目的感觉,所以这里直接用 MySQL 演示。用 Docker 起一个 MySQL 最简单,或者在本地机器上装好 SQLyog、Navicat 之类的可视化客户端。准备一个叫todo_db的数据库,然后在application.yml里配置连接信息:

spring: datasource: url: jdbc:mysql://localhost:3306/todo_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: 你的密码 jpa: hibernate: ddl-auto: update show-sql: true

ddl-auto: update表示启动时根据实体自动更新表结构,开发期非常方便;show-sql: true会把执行的 SQL 打印到控制台,方便调试。运行主类TodoApiApplication,看到 Tomcat started 的日志后,打开浏览器访问http://localhost:8080/api/todos,就能看到[]空数组。再用 Postman 或 Apifox 往/api/todos发一个 JSON 体{"title":"写第一篇文章","completed":false},再刷新 GET 接口,数据就稳稳落库了。

4.6 用 Maven 打包,交付一个可运行的 jar

开发完成后,打包部署是 Spring Boot 的拿手好戏。在命令行或 IDEA 终端里执行:

mvn clean package

构建完成后,target目录下会生成一个todo-api-0.0.1-SNAPSHOT.jar,这就是一个内嵌了 Tomcat 和所有依赖的可执行 jar。在服务器上执行:

java -jar todo-api-0.0.1-SNAPSHOT.jar

一个 Web 应用就起来了。你不需要外部 Tomcat,不需要额外配置,单文件分发,这对小白来说是最直观的正反馈——原来后端应用可以这么简单地交付。

5. 新手翻车高发区:四个常见报错和完整排查思路

跑通上面项目时,你大概率会在某些环节遇到报错。报错不可怕,可怕的是不知道从何下手。下面整理四个我自己和周围同学踩得最频繁的坑,每一项都给出完整的排查链路,而不是直接丢一个答案,因为下一次报错可能只是长得像,根因完全不同。

5.1 端口被占用:Tomcat failed to start 系列

现象是启动日志里出现Web server failed to start、Port 8080 was already in use。原因就是 8080 端口已经被别的进程占用,最典型的是上一个没关掉的应用实例或其它程序占用了同一端口。

排查顺序先定位是谁占用的。Windows 下执行netstat -ano | findstr :8080,看到一条监听记录的最后一列是 PID,再去任务管理器里按 PID 找进程。确认不是重要进程后结束掉;如果有别的服务必须用 8080,那就改自己应用的端口,在application.yml里加:

server: port: 8081

改完重启问题即解。这个问题的本质是端口冲突,了解netstat的用法比死记报错有用得多,以后遇到 9090、3306 之类的端口占用都可以套用同一个思路。

5.2 时区报错和 SSL 警告:MySQL 连接串的常见坑

连接 MySQL 时常见的报错是The server time zone value ... is unrecognized,或者警告SSL connection error。MySQL 8 以后对时区要求变得严格,而你本地系统的时区没被正确识别。

排查思路是确认连接串是否完整。在 JDBC URL 后面携带serverTimezone=Asia/Shanghai,时区就明确指定了;useSSL=false解决本地开发时的 SSL 认证告警;如果本地 MySQL 账号的认证插件是caching_sha2_password,可能需要再加allowPublicKeyRetrieval=true。这一串参数看起来琐碎,但它们分别对应一个真实问题,存疑的时候逐个删减测试,能帮你建立直觉。

5.3 JPA 在启动时就炸了:数据库不存在或账号权限不足

当你特意去配置 MySQL 而数据库还没手动创建时,应用启动到一半就报Cannot create JDBC driver ... Unknown database之类的错误。不少人会在配置里填了一大堆连接参数后忽略了“数据库本体是否真实存在”这一步。

排查路径很简单:先用可视化客户端连上 MySQL 实例,检查todo_db这个库在不在。不在就执行create database todo_db再启动;如果库在但提示访问被拒绝,再回来核对密码和账号权限。这里值得养成的习惯是:改完任何配置文件后,不要凭记忆推断问题,先看完整堆栈日志,确定它到底卡在数据库连接还是别的地方,再决定动手方向。

5.4 依赖版本冲突:我明明按教程写的,怎么就是编译不过

Spring Boot 的 starter 已经帮你锁定了大部分依赖版本,但在引入额外组件、或者手动加依赖时,有时候还会看到编译期报错,比如ClassNotFoundException或方法签名对不上。核心原因是某个库的版本被覆盖成了不兼容的版本。

排查思路是先跑mvn dependency:tree看依赖树,找出报错相关的 jar 实际解析到的版本。发现问题后,可以在pom.xml里显式声明这个依赖并覆盖版本号,比如:

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>

新手看到依赖冲突最容易犯的错是删了重加只留一个笼统的 starter,结果旧的库还挂在别处。多花点时间读依赖树输出,把它当成定位工具,比瞎蒙有效率得多。

6. 学完这些之后该往哪走:进阶路线与资源建议

能独立写完一个带数据库的 API 之后,你已经越过了 Spring Boot 最陡峭的学习曲线。接下来不是继续刷更多 CRUD,而是围绕真实项目里必然出现的需求做扩展,这里给一条实用的进阶路线,以及几个我自己觉得性价比很高的方向。

6.1 趁热打铁:把开发体验再打磨一下

先做一些不涉及新知识但显著提升效率的小事。第一个是引入spring-boot-devtools,这个依赖能实现代码热部署,改完方法体不用手动重启应用,对调试心态非常友好。只要在 pom 里加上:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>

第二个是理解多环境配置。把application.yml拆成application-dev.yml和application-prod.yml,再在主配置文件里用spring.profiles.active=dev切换环境。开发环境可以把日志打全、SQL 显示出来;生产环境关掉 SQL 输出、调整连接池大小。这个思维和真实开发流程是接轨的,早点养成习惯会帮你过渡到团队协作。

6.2 围绕场景学组件,而不是背组件文档

很多人学 Spring Boot 进阶一直卡住,是因为从“组件名”出发去学,今天看 Redis 教程,明天追 Kafka 教程,学完发现还是不会在项目里融合。我的建议是反过来,从一个具体场景出发。比如你想写一个带用户登录的 API,自然就会需要 Spring Security 或 Sa-Token;你发现接口响应慢、数据重复查询,自然就会引入 Redis 缓存;你希望两个服务之间解耦通信,再去看消息队列就有明确动机。一个场景打通,你对这个组件的理解深度远胜于背十篇入门文档。

推荐的国内学习资源方面,优先看官方文档和各类源码解析文章,遇到问题直接去 Stack Overflow 和官方 issue 区搜英文报错,比搜索引擎中文内容更高效。别囤积一堆视频课程,那只会让你产生“收藏了等于学会了”的错觉。

6.3 给自己定一个三个月内的主攻方向

按自己的兴趣选择一个方向深入:如果是做业务后端,重点钻透 Spring Data JPA 的复杂查询和事务管理;如果想走架构路线,接触一下 Spring Cloud 的基本组件会很有趣——服务注册发现、配置中心、网关这些名字听起来吓人,但有了单体应用的基础再看分布式全家桶,会清晰很多,本质上还是 Spring Boot 应用通过各种注解和配置变成多个协作节点。

我个人的经验是,Spring Boot 的学习不要指望一次性看完所有视频或文档,它是那种“做项目时认识新朋友”的框架。你写第一个 API 认识了 Controller,写登录用到了 Security,部署上线认识了 Linux 和 Docker,逐步扩展比从入门到放弃的疲惫循环强得多。

最后分享一个我反复跟朋友强调的小技巧:学 Spring Boot 时,把每个成功跑通的“最小案例”留在本地或 GitHub 上,哪怕它只是三行接口。之后做项目时随时从这里复制配置、复制结构,迭代速度会快得超乎想象。很多人总是想从零开始写一套大而全的模板,实际上真正高效的路径是从小模块不断累加工地,每加一块就运行一次,确认成功再继续下一步。保持这个节奏,你会发现所谓“全栈开发”也不过是一连串规模可控的小任务串起来的结果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 6:42:52

ARM 嵌入式 Linux 网络设备驱动开发实战

摘要:本文以经典的 DM9000 以太网控制器为例,手把手带你从零构建一个可用的 Linux 网卡驱动。内容覆盖内核网络分层架构、net_device 核心数据结构、硬件接口与环境搭建、驱动初始化与设备注册、数据包发送与缓冲区管理、中断接收逻辑、启停控制、编译加载、故障排查以及性能…

作者头像 李华
网站建设 2026/10/11 6:40:54

基于PJ85718DM与MKV44F256VLH16的嵌入式温度监测系统设计与实现

1. 项目缘起与整体设计思路嵌入式温度监测这件事&#xff0c;说起来简单&#xff0c;做起来坑不少。我最早接触这类需求是在一个暖通空调控制板的项目上&#xff0c;当时的需求很朴素&#xff1a;板子上要同时知道"本地环境温度"和"远端某个关键节点的温度"…

作者头像 李华
网站建设 2026/10/11 6:40:31

Emacs中找回Ctrl+C/V:cua-mode配置与实战指南

第一次打开那款以可扩展著称的老牌编辑器时&#xff0c;我下意识按下一个快捷键&#xff0c;然后愣住了。我要复制的代码还在屏幕上&#xff0c;但编辑器把那次按下当成了取消命令——没错&#xff0c;就是 CtrlC。那一刻我第一次认真想一个问题&#xff1a;为什么全世界的图形…

作者头像 李华
网站建设 2026/10/11 6:39:42

员工一请假,工厂报表就停摆?AI 帮老板盯着这 8 张表

老张 50 岁&#xff0c;浙江一家 80 人服装厂的老板。 他什么都懂——Excel 会看&#xff0c;账能对&#xff0c;单能签。 他最近最怕的事&#xff1a;文员小王请假。 上个月小王回了趟老家结婚&#xff0c;连请 5 天。 那 5 天&#xff0c;销售日报没人做、库存台账没人更、客…

作者头像 李华
网站建设 2026/10/11 6:38:55

cua 命令行管家:用一条命令管好所有脚本和常用命令

聊一个我最近花两个晚上搓出来的小工具&#xff0c;名字叫cua&#xff0c;全称 Command Utility Assistant&#xff0c;说白了就是一个跑在终端里的“命令管家”。它解决的痛点是&#xff1a;日常开发中总有随手写在某个角落的脚本、经常敲但总记不全的命令、散落在各处快照里的…

作者头像 李华
网站建设 2026/10/11 6:36:29

腾讯又来一王炸,开源版 WorkBuddy 太夯了!

WorkBuddy 太火了&#xff0c;我就这么说吧&#xff0c;如果说最近这段时间国外 Coding Agent 讨论最多的是 Claude 的话&#xff0c;那么国内讨论度最高的&#xff0c;那就得是 WorkBuddy 了。 火到什么程度&#xff0c;我看了一下我自己的公众号后台关注的人群&#xff0c;有…

作者头像 李华