首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 架构:20 行代码,看清依赖倒置与六边形架构

Java 架构:20 行代码,看清依赖倒置与六边形架构

原创
作者头像
用户12777917
发布于 2026-09-23 11:17:08
发布于 2026-09-23 11:17:08
1640
举报

很多 Java 项目一谈架构,就开始堆技术栈:Spring Cloud、Kafka、Redis、分库分表、微服务。 结果代码越写越多,依赖越来越乱:Controller 直接调 Mapper,Service 里塞满业务逻辑,领域模型变成贫血对象,换个数据库要改半个系统。

Java 架构的核心,从来不是“用了多少中间件”,而是依赖方向有没有管住。 下面用 20 行代码,搭一个最小六边形架构,把这件事说清楚。

一、架构的本质:管依赖方向

六边形架构,也叫端口适配器架构。它只强调一件事:

  • 领域层和应用层不依赖框架、数据库、消息队列;
  • 外部世界通过“端口”接入;
  • 具体实现放在“适配器”里;
  • 组合根负责把实现装配进去。

用文字表示就是:

代码语言:javascript
复制
入站适配器 -> 应用服务 -> 端口 <- 出站适配器

业务代码只认识端口,不认识 MySQL、Redis、Spring。

二、少量代码实战:最小六边形

下面代码用纯 Java 写,不依赖任何框架。它模拟“下单”用例:应用服务校验金额,然后通过端口保存订单。

代码语言:javascript
复制
import java.util.*;

interface OrderRepository { void save(Order order); }
record Order(String id, int amount) {}

class PlaceOrderService {
    private final OrderRepository orders;
    PlaceOrderService(OrderRepository orders) { this.orders = orders; }

    void place(String id, int amount) {
        if (amount <= 0) throw new IllegalArgumentException("金额必须大于0");
        orders.save(new Order(id, amount));
    }
}

class InMemoryOrderRepository implements OrderRepository {
    private final Map<String, Order> db = new HashMap<>();
    public void save(Order order) { db.put(order.id(), order); }
}

public class Main {
    public static void main(String[] args) {
        OrderRepository repo = new InMemoryOrderRepository();
        new PlaceOrderService(repo).place("A001", 100);
        System.out.println("下单成功");
    }
}

代码很短,但架构关系已经完整:

  • OrderRepository 是出站端口;
  • InMemoryOrderRepository 是出站适配器;
  • PlaceOrderService 是应用服务,只依赖端口;
  • Main 是组合根,负责装配具体实现。

如果换成 MySQL,只需要新增一个 JpaOrderRepository,PlaceOrderService 一行不用改。 如果换成 REST 入口,只需要新增 Controller,应用服务仍然不变。

三、从 Demo 到企业级,还差什么?

上面只是骨架,企业级 Java 架构还要补齐:

  1. 模块化:Maven/Gradle 多模块,领域、应用、适配器分层隔离。
  2. 依赖注入:Spring 负责装配,但领域层不引入 Spring 注解。
  3. 入站适配器:REST、gRPC、MQ Consumer、定时任务。
  4. 出站适配器:JPA、MyBatis、Redis、Elasticsearch、Kafka。
  5. 架构守护:用 ArchUnit 写测试,禁止领域层依赖框架。
  6. 可观测性:Micrometer、OpenTelemetry、结构化日志。
  7. 演进路径:先模块化单体,再按边界拆微服务。

真正的企业级架构,不是一上来就微服务,而是先把边界和依赖方向管住。

四、关键认知

  • 架构不是框架,是依赖规则。
  • 领域层不能依赖 Spring、JPA、HTTP。
  • 组合根负责装配,业务代码不 new 具体实现。
  • 可测试性来自边界,边界清晰才能 mock 和替换。
  • 少量代码也能体现架构,关键是方向对不对。
  • 架构不是画在 PPT 上,而是每天写代码时的约束。

结语

Java 架构的起点,不是引入多少中间件,而是把依赖方向管住。 上面 20 行代码,先跑通它,再逐步叠加模块、权限、事务、缓存、消息和监控。

代码可以少,但依赖方向不能乱。 架构不是让你写更多代码,而是让你在系统变大时,仍然改得动、测得准、换得起。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、架构的本质:管依赖方向
  • 二、少量代码实战:最小六边形
  • 三、从 Demo 到企业级,还差什么?
  • 四、关键认知
  • 结语
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档