架构不是堆砌框架,而是控制依赖的方向。一行接口,往往比一千行配置更能决定系统的可维护性。
绝大多数 Java 项目最终都会长成类似的样子:
分层的本质是关注点分离。但仅仅分层还不够,如果 Controller 直接依赖具体的 Service 实现,Service 直接依赖具体的 Repository 实现,代码依然会紧耦合,难以测试和替换。
真正的架构功力,体现在依赖倒置:高层模块不依赖低层模块,两者都依赖抽象。
下面这段 Java 代码不到 15 行,却展示了架构中最核心的解耦手法。
interface UserRepository {
User findById(Long id);
}
class UserService {
private final UserRepository repo;
UserService(UserRepository repo) { this.repo = repo; }
User getUser(Long id) { return repo.findById(id); }
}
class MySqlUserRepository implements UserRepository {
public User findById(Long id) { /* 查数据库 */ return new User(); }
}
class InMemoryUserRepository implements UserRepository {
public User findById(Long id) { /* 查内存 */ return new User(); }
}UserService 不关心数据来自 MySQL 还是内存,它只依赖 UserRepository 接口。这样:
InMemoryUserRepository,无需启动数据库UserRepository 可以变成远程调用客户端这就是架构的杠杆效应:用抽象隔离变化。
很多人以为微服务是架构的终极目标,其实它只是分层和依赖倒置在分布式场景下的延伸。
无论架构如何演进,核心始终是:控制依赖方向,让变化点局部化。
controller、service、dao)。领域包内聚,层间通过接口通信。@Autowired 很方便,但不要为了注入而注入。构造函数注入 + final 字段,能强制依赖不可变。Java 架构的复杂度,往往来自过度设计和依赖失控。 先用少量代码把依赖倒置跑通,再逐步引入框架、微服务和分布式组件。 好的架构不是画出来的,而是通过一次次解耦,让系统在变化面前保持从容。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。