资讯动态

前端转后端学习路线:从零搭建第一个Spring Boot接口

发布时间:2026/9/18 11:40:59 来源:尧图企业网站定制
说个有意思的事我起初搜“后端学习路线”首页全是芯片后端、数字后端之类的东西差点给我整不会了。后面才搞明白我们前端常说的“后端”是软件开发里的服务端跟芯片设计那个完全是两码事。这篇文章想聊的就是给前端同行一份“起手式”——从一个能写 Vue/React 页面的前端到能独立把一个后端接口从 0 写到跑起来这段路到底该怎么走、先学什么、后学什么、哪些坑可以绕开。先说明一下这文章不是给你灌“三个月转后端月薪翻倍”的鸡汤也不是列一张几十项技能的学习清单然后让你自己摸索。我的思路是站在前端已有的知识基础上用“逆向拆解 最短路径实操”的方式把后端这扇门推开。你不需要先啃完《Java 编程思想》也不用背满脑子八股文你只需要跟着我这条线路走先把自己第一个能返回 JSON 的接口写出来跑通前后端联调然后再回头补理论会轻松非常多。1. 先搞清楚前端人眼里的“后端”到底是个什么东西这个问题看起来简单但很多前端同行其实没真正想明白。后端不是一个“神秘的运行环境”也不是“Java 或者 Go 的专属领域”。从职责上讲后端就是处理数据、执行业务规则、管理资源的那部分程序。你前端页面上看到的所有内容如果它是动态的比如从数据库里查出来的订单列表、登录之后的用户昵称那就一定是后端通过接口提供的。1.1 前后端的本质分工我们用一个点外卖的场景来类比。你打开外卖 App 选了一家店点了一份黄焖鸡然后下单、付款、看骑手位置。这里面每一个动作背后后端都在干活查店铺还开不开、库存够不够、优惠券能不能用、钱包余额够不够、生成订单、通知商家、派单给骑手。前端负责的是把这些过程展示成按钮、页面、loading 状态让用户感觉“丝滑”。后端负责的是把每一件事真正“办成”。所以前后端不是一个量的差别是思维模型的天壤之别前端处理“展示与交互”后端处理“事实与规则”。你如果一直用前端的思维去理解后端会很容易钻牛角尖比如“为什么删除要先查一次再删为什么不能直接把整个列表返回让前端自己过滤”因为后端面对的是多用户、并发、数据一致性的问题它必须保证数据在任意时刻都是准确、可追溯、不会被两个人同时改坏的。这是理解后端所有设计的第一把钥匙。1.2 前端学后端最容易踩的认知误区我见过太多前端朋友一上来就去做一个特别大的项目比如“仿淘宝”“仿微信”然后卡在环境搭建、依赖冲突、数据库设计上最后半个月过去连登录接口都没写完直接放弃。还有一个典型的误区是觉得“后端就是写接口”把 Controller 里堆满逻辑数据库随便建张表查询全靠遍历上线之后数据一多直接崩。这些问题的根子都在于对后端要做什么、做到什么程度缺少一个整体的“模块感”。我建议你上手之前先在脑子里形成一个四层结构的模型表现层Controller只是接收 HTTP 请求和返回数据它不负责业务核心业务层Service才是关键下单、支付、库存扣减这些规则都写在这里数据访问层Mapper/DAO只负责跟数据库打交道数据库本身存数据。前端同学最容易跳层一上来就在 Controller 里写 JDBC后面想改逻辑就会发现牵一发动全身。先把这个分层意识建立起来你后面写的东西才能叫后端工程而不是一段能跑的脚本。2. 技术选型第一个后端语言和框架到底怎么选前端学后端第一个纠结往往不是“怎么学”而是“学什么”。打开招聘软件后端岗位有 Java、Go、Python、C#、Node.js 一大堆每个都有人说好。我要给一个比较务实的结论不是打太极的那种“看情况”而是真的结合前端的现状来选。2.1 Java Spring Boot 还是 Node.js如果你学后端的核心目的是“找工作”国内目前后端岗位需求量最大、面试资料最全、企业存量系统最多的依然是 Java 生态这里绕不开 Spring Boot。你只要去看看招聘网站Java 后端的岗位数量基本上是其他语言加起来都拼不过的。而且 Spring Boot 本身把很多繁琐的配置做成了“约定大于配置”对新手比早期的 SSM 时代友好得多。它的学习曲线没有你想象的那么陡。如果你学后端的目的是“自己做全栈产品、给个人项目写后端”那我反而建议你直接用 Node.js比如 NestJS 或 Express。原因很简单你前端已经有 JavaScript/TypeScript 基础没有语言转换成本写起来特别快一个小项目三天就能上线。Node.js 在处理 I/O 密集的场景也完全够用个人博客、工具箱、小程序管理后台这类项目性能根本不是瓶颈。2.2 我明确推荐前端走的路线我个人的建议是主力学 Java Spring Boot业余用 Node.js 做小工具。这不是贪多而是你有了 Java 的基础之后看 Node.js 代码会发现“这套分层思想怎么这么像”反过来你写前端的经验又能帮你理解 Node.js 的事件驱动模型。对我来说Java 给的是“工程感”和“规范化”Node.js 给的是“灵活性”和“快感”两者互相补位。当然不管你选了哪条我都建议你把精力集中在一条主线上至少两个月。前端同学很容易犯一个毛病就是今天刷到 Python 觉得也行明天看到 Go 觉得工资高结果每条线都学了开头每条线都没学会。选定了就真正跑通一个“从数据库到接口到前端展示”的闭环这个过程比选什么语言重要十倍。2.3 选型之后需要准备的开发工具清单工具不在多但有些是必须提前装好的。我这里以 Java Spring Boot 路线为例列一个前端同学比较陌生的清单JDKJava Development KitJava 的运行和编译环境推荐装 JDK 17 或 21不要装 8 了新项目没必要守着老版本。IntelliJ IDEA写 Java 最主流的 IDE社区版免费功能对学习来说够用。网上很多教程让你用 Eclipse我建议直接略过浪费时间。MavenJava 世界的“包管理工具”类似前端的 npm。它负责下载依赖、打包项目用 IDEA 自带的功能就能完成大部分操作。MySQL最常用的关系型数据库存核心业务数据。你可以在本地装一个也可以用 Docker 起一个后面我会详细讲。Navicat 或 DBeaver数据库可视化工具类似前端的“浏览器开发者工具”让你能直观地看表、查数据。Postman 或 Apifox接口调试工具省得每次测试接口都要写一段前端代码调。这些工具大部分你都会在第一次动手时用到别急着一次全装明白边写边装效率更高。3. 利用前端优势逆向学习先看懂接口再写接口很多前端转后端的人都低估了自己手里的两张王牌第一你已经在浏览器里看过无数个接口的请求和响应了第二你写过联调代码你知道前端真正需要后端提供什么。这就是最大的优势——你不需要从零学“什么是接口”你只需要换个视角把调接口的人变成写接口的人。3.1 从网络面板里读出后端的“潜台词”打开任意一个你参与过的前端项目按 F12 切到 Network 面板找几个接口看看。你会在里面看到请求 URL、请求方法GET/POST/PUT/DELETE、请求头、请求体、响应 JSON、状态码。这些信息一个合格的后端开发者每天都在看。前端人看它们是“我要拿到数据”后端人看它们是“我要定义数据和规则”。这里我建议你做一个小练习把你手头项目的 10 个接口挨个分析一遍写清楚每个接口的路径、方法、入参、出参、状态码含义。然后问自己一个问题如果现在这个后端接口消失了让我自己来实现我需要哪些信息才能写出来你会发现答案就是“一张表的结构”加“一段业务规则”。这就是后端开发每天面对的事情。3.2 HTTP 和 RESTful 设计里前端人必须吃透的几个点前端调接口时可能只知道“GET 拿数据、POST 提交数据”但写后端要求你对 HTTP 的理解更精细。比如这几个点GET 请求的参数放在 URL 的 query string 里POST 请求的参数通常放在 body 里但 RESTful 风格更强调用 URL 路径本身表达资源比如 GET /api/user/1 表示查询 id 为 1 的用户而不是 POST /api/user?actiongetid1。状态码也是前端容易忽略的“信息通道”。你写的后端接口返回 200 表示成功、400 表示客户端传参有问题、401 表示未登录或登录过期、403 表示没有权限、404 表示资源不存在、500 表示服务器内部错误。前端联调时经常整个人懵掉就是因为后端返回的信息不够明确。你现在学后端正好可以从源头养成好习惯错误信息写清楚状态码用对这会在联调时帮你省下无数沟通成本。3.3 数据库认知从“表格思维”开始别怕 SQL前端没接触过数据库的时候会觉得 SQL 是很吓人的东西实际上核心就四句话SELECT 查、INSERT 增、UPDATE 改、DELETE 删。你先学会这四种语句的基本写法再搞懂 WHERE 条件和 JOIN 联表就足够应付绝大多数接口开发了。类比一下数据库的表就是一个带行列的 Excel外键关联就是 VLOOKUP索引就是给 Excel 加筛选排序的辅助列。你平时在前端处理的数组对象的筛选、映射、分组放到 SQL 里无非就是 WHERE、SELECT、GROUP BY 换个语法而已。我见过很多前端写不好后端不是不会写逻辑是根本不敢写 SQL。我的建议是不要跳过这一关你哪怕以后用 MyBatis-Plus 这类工具自动生成 SQL也得先能读懂生成出来的语句是干什么的。不然线上数据查出来不对你连排查的方向都没有。4. 第一个后端项目实操从环境搭建到接口跑通下面我们进入真正的实操。这一节我会带你走一遍“从一张空表到一个能返回 JSON 的登录接口”的完整过程。为了避免把篇幅拉太长我以 Spring Boot MySQL MyBatis-Plus 为例这是前端转型后端时上手效率很高的一套组合。4.1 环境搭建JDK、Maven、IDEA 的配置细节装 JDK 的时候我建议直接装 Oracle JDK 或 Eclipse Temurin 的 JDK 17下载完就是一个可执行文件安装好之后需要配置环境变量 JAVA_HOME 和 PATH。IDEA 2022 之后的版本内置了对 JDK 版本的良好支持创建项目时直接选对应的 SDK 就行。这里我给个提醒JDK 装好之后命令行执行 java -version 如果能正常打印版本号说明环境变量配好了后面 Maven 才不会有各种各样的鬼问题。Maven 是很多前端初次接触后端时的噩梦本质就是你 npm 仓库只是配置文件叫 pom.xml。默认的 Maven 中央仓库服务器在国外下载依赖慢到怀疑人生所以第一步必须把镜像改为国内源。找到 Maven 安装目录下 conf/settings.xml在 mirrors 标签里加一段mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror改完之后在 IDEA 的 Settings 里把 Maven 的 user settings file 指向这个 settings.xml这样你创建 Spring Boot 项目时下载依赖就会快很多。这一步做完我建议你把 IDEA 的编码统一设成 UTF-8默认编译级别也确认一下避免后面中文乱码和编译版本不匹配的问题。4.2 创建项目与基础依赖打开 IDEAFile - New - Project选择 Spring Initializr。Type 选 MavenJava 版本选 17。依赖这里我推荐先勾这几个Spring Web提供接口开发的核心能力类似前端的路由框架。MySQL Driver让 Spring Boot 能连上 MySQL。MyBatis-Plus Framework一个 ORM 框架帮我们把 SQL 和 Java 对象做映射省去手写大量重复 SQL 的体力活。创建完之后等待 Maven 下载完依赖。第一次可能比较慢正好可以趁这个时间准备数据库。提前用 Navicat 或命令行创建一个数据库比如叫 demo_db然后执行一条建表 SQLCREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL COMMENT 用户名, password VARCHAR(100) NOT NULL COMMENT 密码, nickname VARCHAR(50) DEFAULT NULL COMMENT 昵称, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 );这张表对应的是用户实体。你后面写的接口就是围绕这张表做增删改查。4.3 编写配置文件与第一个接口在 src/main/resources/application.yml 里写入数据源配置server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/demo_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true注意 url 里必须带上 characterEncodingutf8 和 serverTimezoneAsia/Shanghai不然你查出来的中文会乱码时间还会差 8 小时。这是我见过新手报错率最高的两个点。接下来创建 Controller、Service、Mapper 三个类我直接给一个最简结构。User 实体类字段对应数据库列UserMapper 继承 BaseMapperService 里写一个查询所有用户的方法Controller 里暴露一个 HTTP 接口RestController RequestMapping(/api/user) public class UserController { Autowired private UserService userService; GetMapping(/list) public Result list() { return Result.success(userService.list()); } }这里我不细抠每一行业务代码重要的是你建立一个“请求 - Controller - Service - Mapper - 数据库 - 返回 JSON”的链路感知。当前端通过 axios 请求 /api/user/list 时你会发现返回的数据格式和你平时调别人接口拿到的几乎一样。这一步跨过去你后端的门就进了一半。4.4 用 Postman 和前端项目同时验证写好代码启动 Spring Boot 应用看到控制台打印出 Tomcat started on port 8080 之后打开 PostmanGET 请求 http://localhost:8080/api/user/list。如果数据库里有你手动插入的两条测试数据这里就能看到包含两条记录的 JSON。然后你可以开一个最简单的 Vue 或原生 HTML 页面用 fetch 或 axios 请求这个接口把它渲染到页面上。到这一步你就算真正完成了一个前后端联动的闭环。5. 前后端联调高频问题跨域、鉴权、参数格式接口写出来了但真正和前端的代码一对接你会发现一堆联调期特有的问题。这里我挑几个前端转后端的人一定躲不过的讲透。5.1 跨域问题到底是谁的锅“后端跨域”这个词我经常在前端社区看到但它其实描述得不够准确。跨域的根源是浏览器的同源策略也就是说这是浏览器对网页里的 JavaScript 请求做的限制。你的前端页面在 localhost:5173后端接口在 localhost:8080端口不同就算同源。浏览器会拦截响应这在开发环境尤其常见。解决办法在后端加 CORS 配置。Spring Boot 里十分简单创建一个配置类实现 WebMvcConfigurer重写 addCorsMappingsConfiguration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }这段配置的意思是所有路径都允许跨域请求支持常用的 HTTP 方法允许携带凭证比如 Cookie。配好之后重启前端再调接口就不会被浏览器拦截了。另外你还需要注意 OPTIONS 预检请求前端发非简单请求时浏览器会先发一个 OPTIONS 请求探路后端如果不放行照样跨域失败。5.2 Token 登录态前端存了 token后端如何验证前端开发里登录之后把 token 存到 localStorage 或者 Pinia/Vuex 里请求拦截器里塞到 Authorization 头——这个流程前端同学很熟。但后端到底是怎么验证这个 token 的这可能是前端学后端最想搞清楚的一个点。主流方案是 JWT一段经过签名加密的字符串后端在用户登录成功后生成并返回给前端。之后前端每次请求都带上它后端通过拦截器Interceptor或过滤器Filter把请求拦下来解析 token 里的用户信息能解出来就放行解不出来就返回 401。这里我特别提醒一个新手常犯的错误很多前端写过“如果接口返回 401 就跳登录页”的逻辑但自己写后端时拦截器只拦了业务接口却忘了放行登录接口本身。结果就是用户都没登录你怎么让他访问登录接口去拿 token这属于典型逻辑死锁。处理办法是在拦截器配置里加上 excludePathPatterns 把 /api/auth/login 这类接口排除掉。5.3 前端传参的三种姿势后端如何接收前端开发时请求参数有三种常见形态GET query string、POST 表单格式、POST JSON 格式。后端接收方式完全不同很多刚转后端的同学分不清导致接口一直调不通。query 参数前端 axios 用 params 传后端用 RequestParam 接收或者简单点直接在 Controller 方法参数里写个不带注解的普通参数Spring Boot 会自动绑定。表单格式前端用 application/x-www-form-urlencoded 传后端用 RequestParam 接收或者用一个对象接收字段名和表单 name 对应。JSON 格式前端用 application/json 传后端必须用 RequestBody 加一个实体类来接收。实际开发中现在最常见的约定是 POST JSON body也就是前端 axios.post(url, { username: xx, password: xx }) 这种。后端一个 RequestBody UserLoginDTO dto 就能收下来。如果这里你发现一直报错先看看请求头 Content-Type 是不是 application/json再看后端是不是加了 RequestBody这两者不匹配是联调期最高频的 400 错误来源。6. 部署上线用 Docker Compose 把你的前后端项目一起跑起来本地能跑通了下一步就是上线。这是很多独立开发的前端同学的终极大关因为服务器环境跟本地不一样数据库、Java 环境、Node 环境、Nginx 全部要装一遍每一步都可能遇到权限问题、版本问题、端口问题。这时候 Docker 和 Docker Compose 就是救星。6.1 前端和后端分别打包成镜像前端项目一般打成静态文件用 Nginx 跑。写一个 DockerfileFROM nginx:alpine COPY dist/ /usr/share/nginx/html/ COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80这里 dist 是你前端构建产物目录nginx.conf 里除了常规的静态文件服务还要加一条 location 把 /api 的请求转发到后端服务。这个小技巧很关键前端部署后访问的接口路径可以写成同源的 /api由 Nginx 反向代理到后端容器这样你连跨域配置都可以省掉。后端项目用 Maven 构建打包成 jar然后写另一个 DockerfileFROM maven:3.8-openjdk-17 AS builder COPY . /app WORKDIR /app RUN mvn clean package -DskipTests FROM openjdk:17-jdk-slim COPY --frombuilder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, /app.jar]这个是多阶段构建第一阶段用 Maven 镜像把项目编译成 jar第二阶段只留一个精简的 JRE 环境来跑 jar。好处是最终镜像很小部署更快。6.2 用 docker-compose.yml 一键编排多服务我的建议是别一个个 docker run直接写一个 docker-compose.yml把 MySQL、后端、前端三个服务一次性编排起来。下面是一个可以照着用的最小配置version: 3.8 services: mysql: image: mysql:8.0 container_name: app-mysql environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: demo_db ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql command: --default-time-zone08:00 backend: build: ./backend container_name: app-backend depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/demo_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai ports: - 8080:8080 frontend: build: ./frontend container_name: app-frontend depends_on: - backend ports: - 80:80 volumes: mysql_data:注意一个核心细节容器里的后端连接数据库地址不能写 localhost而要写 MySQL 服务的名称也就是 mysql。因为每个容器都有自己的网络命名空间localhost 指向的是容器自身。这个坑几乎所有第一次用 Docker 部署的人都会踩记下来能帮你省至少一小时的排查时间。真正部署时执行 docker compose up -d --build全部服务就起来了。用浏览器访问服务器 IP 的 80 端口看到你的前端页面说明整个前后端项目正式上线。7. 避坑实录与学习路线安排建议我把自己和身边朋友在学习过程中踩过的坑整理了一个速查表不敢说全但命中率极高。你如果遇到类似问题优先按这个方向排查。现象大概率原因处理方式Maven 依赖下载超时默认中央仓库在国外换阿里云镜像重新导入数据库中文乱码连接串缺 characterEncoding在 jdbc url 加 characterEncodingutf8时间差 8 小时时区没指定连接串加 serverTimezoneAsia/Shanghai容器里加 TZAsia/Shanghai前端请求 404路径或请求方法不匹配检查 Controller 的 RequestMapping 和前端 url 是否一致前端请求 405方法不对GET/POST/PUT/DELETE 要一致别用错前端请求一直 500后端代码空指针或 SQL 异常看后端控制台堆栈从第一条异常开始看登录接口 401 死循环拦截器没放行登录接口加 excludePathPatterns 排除登录路径图片无法在页面上显示图片服务器加了 Referer 防盗链前端用 no-referrer 策略或后端配置白名单Docker 里后端连不上数据库用了 localhost改成 compose 里的服务名 mysql端口被占用本机应用冲突lsof -i:8080 找到进程杀掉或换端口表格只能帮你定位真正有价值的还是你要亲手走一遍这些坑。我见过太多人看文章收藏夹吃灰一到自己动手照样懵。所以我特别建议你每踩一个坑就写一段笔记记录现象、原因、解决过程过三个月回看这就是你转后端最值钱的经验资产。7.1 学习路线的关键词清单到了这一步你已经具备独立开发简单后端服务的能力了。如果要继续往深走我给你一条非常务实的进阶关键词清单按优先级排序Java 基础面向对象、集合、异常、泛型、Lambda/Stream。这些不是面试八股文是让你看 Spring Boot 源码和中间件时不至于完全懵掉的基础。Spring Boot 核心自动配置原理、常用注解、Bean 生命周期。不用一开始就啃源码但要知道一个请求进来经过哪些环节。MySQL 进阶索引原理、事务隔离级别、慢查询优化。这一块是后端从“会写”到“写得好”的分水岭。MyBatis-Plus 或 JPAORM 的套路先会用再理解它生成的 SQL。Redis缓存、分布式锁、Session 共享很多高并发场景必备。消息队列RabbitMQ/Kafka异步解耦等你遇到“接口响应太慢”这类问题时会非常需要。Docker/K8s部署和运维自动化独立开发的必备技能。我不建议你一股脑全学。正确的节奏是先把第一条主线Java 基础 Spring Boot MySQL MyBatis-Plus走到能独立做项目然后再根据工作中实际遇到的问题去扩展。后端这个领域没有天花板但也正因如此你不需要一口气追平别人十年经验先把自己面前的那条路走通后面都是水到渠成。7.2 前端到后端的“桥接思维”心得最后再说几句掏心窝的话。前端转后端最容易的心态错误是“我前端都搞不明白后端是不是更没戏”。其实后端没有比前端难它们只是难的点不一样。前端的难在于 UI 状态管理和浏览器兼容这种“表象层复杂度”后端的难在于数据一致性、并发和上下游协作这种“逻辑层复杂度”。你作为一个有前端基础的人最值钱的能力不是会调 API而是你已经知道“一个功能最终要呈现成什么样”这种以终为始的视角很多只写后端的人反而没有。我个人的体会是前端学后端最好的方式不是回家看视频而是找一个真实的、你能感受到“痛”的场景来驱动。比如你给自己的博客写一个统计访问量的接口或者给你手里的小程序加一个用户反馈的后台。你带着问题去学遇到的问题每一个都会被记住你只是按部就班地跟着教程敲代码敲完三天就忘了。这也是为什么我把这文章标题叫“起手式”而不是“完整剑谱”因为我认为入门阶段最重要的不是招式多全而是一上来就把拳架站对。如果你现在手头已经有一个写好的前端项目我建议你今天下午就干一件事把你项目里所有写死的数据Mock 的列表、写死的用户名列个清单然后选其中一个最不起眼的接口动手用 Spring Boot 或 Node.js 实现一遍连上数据库跑通联调。不用管设计模式不用管性能优化先用最笨的方式让它跑起来。跑通的那一刻你会发现后端这扇门其实比你想的宽得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价