乐于分享
好东西不私藏

AI教我用前端视角看 Spring Boot

AI教我用前端视角看 Spring Boot

前端转 Java 后端,以前最烦的是搭环境——装 JDK、配 Maven、建数据库,代码还没写就劝退了。

现在让 AI 生成项目骨架,直接把后端概念翻译成语前端术语,门槛低了很多。

下面这个 Spring Boot 博客项目,7 个核心文件实现完整的增删改查。我用前端视角带你快速看懂。


先看整体结构



1
2
3
4
5
6
7
8
9

src/main/java/org/example/
├── Main.java                  ← 入口(相当于 index.js)
├── common/Result.java         ← 统一响应格式
├── entity/Blog.java           ← 数据实体
├── controller/
│   ├── BlogController.java    ← REST API(返回 JSON)
│   └── BlogPageController.java← 页面路由(返回 HTML)
└── repository/
    └── BlogRepository.java    ← 数据访问层


第一个认知冲击:两行代码搞定数据库操作



1
2

public interface BlogRepository extends JpaRepository<Blog, Long> {
}


是的,就这两行。因为它继承了 JpaRepository,就自动拥有了 findAll()、findById()、save()、deleteById() 等方法。

前端类比:这就像你引入一个 api.ts 工具库,get/post/put/delete 全部封装好了,直接调用就行——只不过后端这个"工具库"是 Spring Data JPA 自动生成的。

数据模型 = TypeScript 的 interface



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

@Entity
@Table(name = "blog")
public class Blog {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false, columnDefinition = "TEXT")
    private String content;

    @Column(name = "create_time", updatable = false)
    private LocalDateTime createTime;

    // ... getter / setter
}


前端类比:这就是后端的 interface Blog。@Entity 注解告诉 JPA 把它映射成数据库表,@PrePersist 是数据入库前的"钩子"——类似 beforeSave。

统一响应格式:前后端的老朋友



1
2
3
4
5
6
7
8
9

public class Result<T> {
    private int code;
    private String message;
    private T data;

    public static <T> Result<T> success(T data) {
        return new Result<>(200, "success", data);
    }
}


前端开发看到这个一定很眼熟——code、message、data,这不就是每个项目都有的统一返回格式吗?

前端收到的 JSON 就是:



1

{ "code": 200, "message": "success", "data": { "id": 1, "title": "你好" } }


控制器:后端的"路由文件"

REST API 控制器返回 JSON,和前端对接:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

@RestController
@RequestMapping("/api/blogs")
public class BlogController {

    private final BlogRepository blogRepository;

    public BlogController(BlogRepository blogRepository) {
        this.blogRepository = blogRepository;
    }

    @GetMapping
    public Result<List<Blog>> list() {
        return Result.success(blogRepository.findAll());
    }

    @PostMapping
    public Result<Blog> create(@RequestBody Blog blog) {
        return Result.success(blogRepository.save(blog));
    }

    @DeleteMapping("/{id}")
    public Result<Void> delete(@PathVariable Long id) {
        blogRepository.deleteById(id);
        return Result.success();
    }
}


关键注解对照:

注解
含义
前端类比
@RestController
返回值自动转 JSON
res.json()
@GetMapping
处理 GET 请求
router.get()
@PathVariable
路径参数
req.params.id
@RequestBody
接收 JSON body
req.body

完整接口列表:



1
2
3
4
5

POST   /api/blogs      ← 新增
GET    /api/blogs      ← 列表
GET    /api/blogs/{id} ← 详情
PUT    /api/blogs/{id} ← 更新
DELETE /api/blogs/{id} ← 删除


页面控制器:返回 HTML 而不是 JSON

和 REST 接口不同,这个控制器返回的是 Thymeleaf 渲染的 HTML 页面:



1
2
3
4
5
6
7
8
9
10
11

@Controller
@RequestMapping("/blogs")
public class BlogPageController {

    @GetMapping
    public String list(Model model) {
        List<Blog> blogs = blogRepository.findAll();
        model.addAttribute("blogs", blogs);
        return "blog/list";   // 渲染 blog/list.html
    }
}


核心区别:@Controller 返回 HTML(服务端渲染),@RestController 返回 JSON(客户端渲染)。

Thymeleaf 模板里的语法,前端一看就懂:



1
2
3

<tr th:each="blog : ${blogs}">
    <td th:text="${blog.title}"></td>
</tr>


th:each 就是 v-for,th:text 就是 {{ }}。只不过在服务端渲染后直接输出 HTML,浏览器拿到的是完整页面。

配置文件 = 后端的 .env



1
2
3
4
5
6
7
8
9

spring:
  datasource:
    url: jdbc:h2:mem:blogdb      # 内存数据库,启动就用
  h2:
    console:
      enabled: true              # 可视化数据库面板
      path: /h2-console
server:
  port: 8080


H2 是内存数据库,不需要安装 MySQL,开发调试特别方便。/h2-console 相当于一个 Web 版的 Navicat。

从前端到后端的 3 个思维转变

1. 手动 import → 自动注入

前端你手动 import api from './api',后端通过构造函数注入,Spring 自动创建并传入:



1
2
3

public BlogController(BlogRepository blogRepository) {
    this.blogRepository = blogRepository;  // Spring 自动传入
}


2. 手动写 URL → 方法名即 SQL

后端不需要写 SQL,方法名就是查询逻辑:findByAuthor("张三") 自动翻译成 SELECT * FROM blog WHERE author = '张三'。

3. 客户端路由 → 服务端路由

前端用 Vue Router 控制页面切换,后端用 @Controller 返回不同 HTML 模板——一个在浏览器跳转,一个在服务器渲染。

数据流动全景



1

请求 → Controller(接收)→ Repository(查库)→ Entity(映射)→ 返回 JSON/HTML


这就是经典的三层架构:Controller → Service → Repository。

运行方式



1

mvn spring-boot:run


启动后访问:

  • • 博客页面:http://localhost:8080/blogs
  • • REST API:http://localhost:8080/api/blogs
  • • H2 控制台:http://localhost:8080/h2-console

前端转后端,最难的不是 Java 语法,而是理解后端的思维模式:请求怎么流转、数据怎么持久化、异常怎么处理。

以前这些概念需要翻书查文档,现在有了 AI 辅助——你可以让 AI 帮你逐行解释代码、把 Java 概念翻译成前端熟悉的术语、甚至直接生成可运行的项目骨架。AI 不会替你学习,但它能让学习曲线从陡峭变成平滑。

通过这样一个"麻雀虽小五脏俱全"的项目,前端开发者能用自己熟悉的视角——实体=组件、控制器=路由、Repository=API 封装——快速建立起对 Java 后端的直觉。

相关学习资料