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

Ell*_*iot 8 java spring dependencies circular-dependency package

在过去的几周里,我一直在研究Java包结构和依赖模式.关于该主题的着作中的一个共同点是包依赖应该形成有向无环图(DAG)的简单规则.作者罗伯特马丁甚至正式确定了非循环依赖原则(ADP),该原则指出

包之间的依赖关系结构必须是有向无环图(DAG).也就是说,依赖结构中必须没有循环.

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

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

以下开源项目在包之间具有循环依赖关系:

  • Netflix Hystrix(每个包都是一个循环的一部分!)
  • AWS开发SDK
  • 下议院郎
  • 共享的集合
  • 匕首
  • 谷歌Gson
  • 谷歌Guice
  • Hibernate ORM
  • Hibernate Validator
  • 杰克逊核心
  • 乔达时间
  • 玩框架
  • Junit的
  • 的logback
  • 码头
  • AspectJ的
  • 网状
  • java.util中
  • java.lang中

我误解了软件工程原理吗?或者开发商是否对此包装组织技术打折?

参考文献:

Jam*_*eam 2

我可以确认,在使用JArchitect对许多 java 项目进行分析后,其中许多项目都包含包之间的循环依赖关系,原因是许多项目选择“按功能打包”而不是“按层打包”方法。

这是一篇讨论这两种方法之间差异的好文章。

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

在此输入图像描述

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