java - 为什么所有领先的开源 Java 库在它们的包之间都有循环依赖?

标签 java spring dependencies package circular-dependency

过去几周我一直在研究 Java 包结构和依赖模式。关于该主题的著作中的一个共同点是包依赖关系应形成一个简单的规则 directed acyclic graph (DAG)。作者罗伯特·马丁甚至将 Acyclic Dependencies Principle 正式化(ADP),其中指出

The dependency structure between packages must be a directed acyclic graph (DAG). That is, there must be no cycles in the dependency structure.

一些 Java 库确实遵守这个简单的规则。即 Spring Framework库(spring-core、spring-web 等)和 Google Guava .

然而,令我惊讶的是,大多数领先的开源 Java 项目都没有!

以下开源项目在包之间存在循环依赖:

  • Netflix Hystrix(每个 包都是一个周期的一部分!)
  • AWS 开发工具包
  • Commons-Lang
  • 公共(public) Collection
  • Dagger
  • 谷歌 Gson
  • 谷歌指南
  • hibernate ORM
  • hibernate validator
  • jackson 核心
  • 乔达时间
  • 播放框架
  • 单位
  • 登录
  • jetty
  • 看点
  • 网络
  • java.util
  • java.lang

我是不是误解了软件工程原理?或者开发人员是否对这种包组织技术打折?

引用资料:

最佳答案

在使用 JArchitect 分析了许多 java 项目后,我可以确认,其中很多都包含了包之间的循环依赖,原因是很多选择了“按特性包”而不是“按层包”的方式。

这是一个 good article谈论这两种方法之间的区别。

让我们以 JDK 中的一些包为例

enter image description here

这些包是按功能设计的,正则表达式功能分组在 java.util.regex 包中,它需要 java.security 包中的一些安全功能,安全类也需要一些正则表达式功能。

关于java - 为什么所有领先的开源 Java 库在它们的包之间都有循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33809884/

相关文章:

java - 使用 Spring Integration 通过 FTP 下载单个文件

Java 泛型和父类(super class)型标记

java - java处理大量文本文件

java - Spring MVC - Servlet 调度程序抛出异常 : java. lang.StackOverflowError

c - 是否可以在下载时安装 R 包的外部依赖项

java - 如何: Eclipse Maven install build jar with dependencies

gradle - 在Gradle中动态添加依赖项?

java - .Net 客户端与使用原始数据的 Java 服务器

java - 关闭 Spring @Service 的 Autowiring

xml - 如何在 IntelliJ IDEA 中加载 xml 文件