难以置信!我用一个 Java 类替换了整个后端,还真的跑起来了

在软件开发领域,我们往往被各种框架、层次化架构、复杂的配置文件包围。Spring Boot、微服务、DTO、Mapper、Docker……这些东西很强大,但在某些小项目里,它们带来的复杂度可能远远超过了项目本身。

在软件开发领域,我们往往被各种框架、层次化架构、复杂的配置文件包围。Spring Boot、微服务、DTO、Mapper、Docker……这些东西很强大,但在某些小项目里,它们带来的复杂度可能远远超过了项目本身。

我曾经突然冒出一个疯狂的想法:如果只用一个 Java 类,就能实现一个完整的后端服务,会怎么样?

听上去像笑话,对吧?结果我真的试了一下,意外发现:不仅能跑,而且对快速验证原型非常好用。 当然,这不是鼓励大家抛弃架构,而是一次“去除繁杂、回归本质”的尝试。正如一句老话说的:“大道至简。”

故事的起点

一切从一个小型的笔记应用开始。需求极其简单:

  • 保存笔记
  • 获取笔记
  • 修改笔记
  • 删除笔记

换句话说,就是一个标准的 CRUD 系统。 按照传统做法,我会:

  • 起一个 Spring Boot 项目
  • 定义实体、DAO、Service、Controller
  • 加 DTO、Mapper
  • 写配置文件
  • Docker 打包部署

但这对一个微型项目来说,显然是“大炮打蚊子”。于是我自问:

“能不能用一个类就把这些搞定,而且还能保持一定的可维护性?”

执行计划

我设定了几个原则:

  • 使用 Java 自带的 HttpServer(不依赖 Spring Boot)
  • 数据存储放内存里,用一个 Map 就够
  • 所有逻辑放进一个类,但结构要清晰
  • 提供标准 RESTful 接口,前端能直接消费

目录结构非常干净:

/projects/one-class-backend/src/main/java/com/icoderoad/notes/NoteServer.java
单类后端实现
package com.icoderoad.notes;


import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;


import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;


public class NoteServer {
    private static Map<Integer, String> notes = new HashMap<>();
    private static int idCounter = 1;


    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/notes", new HttpHandler() {
            @Override
            public void handle(HttpExchange exchange) throws IOException {
                String method = exchange.getRequestMethod();
                switch (method) {
                    case "GET":
                        handleGet(exchange);
                        break;
                    case "POST":
                        handlePost(exchange);
                        break;
                    case "PUT":
                        handlePut(exchange);
                        break;
                    case "DELETE":
                        handleDelete(exchange);
                        break;
                    default:
                        exchange.sendResponseHeaders(405, -1);
                }
            }
        });
        server.setExecutor(null);
        server.start();
        System.out.println("Server started on port 8080");
    }


    private static void handleGet(HttpExchange exchange) throws IOException {
        String response = notes.entrySet()
                .stream()
                .map(e -> e.getKey() + ": " + e.getValue())
                .collect(Collectors.joining("\n"));
        sendResponse(exchange, response);
    }


    private static void handlePost(HttpExchange exchange) throws IOException {
        String body = new String(exchange.getRequestBody().readAllBytes());
        notes.put(idCounter++, body);
        sendResponse(exchange, "Note added");
    }


    private static void handlePut(HttpExchange exchange) throws IOException {
        String[] parts = new String(exchange.getRequestBody().readAllBytes()).split(":", 2);
        int id = Integer.parseInt(parts[0].trim());
        String note = parts[1].trim();
        if (notes.containsKey(id)) {
            notes.put(id, note);
            sendResponse(exchange, "Note updated");
        } else {
            sendResponse(exchange, "Note not found");
        }
    }


    private static void handleDelete(HttpExchange exchange) throws IOException {
        String body = new String(exchange.getRequestBody().readAllBytes());
        int id = Integer.parseInt(body.trim());
        if (notes.remove(id) != null) {
            sendResponse(exchange, "Note deleted");
        } else {
            sendResponse(exchange, "Note not found");
        }
    }


    private static void sendResponse(HttpExchange exchange, String response) throws IOException {
        exchange.sendResponseHeaders(200, response.length());
        OutputStream os = exchange.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }
}

运行逻辑解析

内置 HTTP 服务器

HttpServer 来自 com.sun.net.httpserver,无需任何第三方依赖:

HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);

瞬间就能起一个 8080 端口的 HTTP 服务。

请求路由

所有 /notes 请求走一个 HttpHandler,再根据 GET/POST/PUT/DELETE 分发。

内存存储
private static Map<Integer, String> notes = new HashMap<>();

    每条笔记有一个自增 ID,完全够小项目用了。

     CRUD 逻辑

    • POST → 新增笔记
    • GET → 查询笔记列表
    • PUT → 修改笔记内容
    • DELETE → 删除指定 ID 的笔记
    测试接口
    # 新增笔记
    curl -X POST http://localhost:8080/notes -d "买牛奶"
    
    
    # 获取所有笔记
    curl http://localhost:8080/notes
    
    
    # 修改笔记
    curl -X PUT http://localhost:8080/notes -d "1: 买咖啡"
    
    
    # 删除笔记
    curl -X DELETE http://localhost:8080/notes -d "1"
    收获与不足

    优点:

    • 启动极快(100ms 内)
    • 无框架开销,零依赖
    • 部署就是一个 .class 文件
    • 非常适合原型开发

    缺点:

    • 无持久化,重启数据丢失
    • 无鉴权,谁都能访问
    • 无校验,脏数据随便进
    • 不适合高并发
    潜在改进方案
    • 引入 SQLite 文件存储
    • 加上基础 Token 鉴权
    • 返回 JSON 格式,而不是纯文本
    • 增强错误处理机制
    适用场景

    可以用的地方:

    • Hackathon 快速原型
    • Demo 演示
    • 本地小工具
    • 教学/实验

    不推荐的地方:

    • 企业级系统
    • 高流量网站
    • 涉及敏感数据的场景

    经验总结

    这次实验让我重新认识了 Java:

    • 框架固然重要,但 Java 本身就足够强大
    • 小项目过度设计,往往是浪费时间
    • 简单起步,再逐步复杂化,往往比一上来就堆满技术更高效

    结语

    我不会真的在生产里上一个“单类后端”,毕竟架构是为了长远稳定。但这个过程提醒我:有时候最好的解决方案,就是去掉那些不必要的复杂性。

    下次当你要做一个小工具时,别急着起 Spring Boot。 也许,一个 NoteServer.java 就能让你秒起后端。

    今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码来知识星球找我,我们会尽力为你解答。

    AI大模型学习福利

    作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

    一、全套AGI大模型学习路线

    AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

    二、640套AI大模型报告合集

    这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    三、AI大模型经典PDF籍

    随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    四、AI大模型商业化落地方案

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值