使用Maven和Spring实现依赖倒置原则

2023-12-19

根据这篇维基百科文章:实现依赖倒置原则 https://en.wikipedia.org/wiki/Dependency_inversion_principle#DIP_implementations可以通过两种方式完成:

  • 在单独的包中对低级组件进行抽象,高级组件和低级组件都依赖于该包。
  • 将低级组件的抽象驻留在高级组件的同一包中。

下图描述了使用两种方法 DIP 之前和之后的依赖关系:

Before DIP: The repository resides in a separate maven module and has no interface, and the service has a direct dependency on the Repository implementation. Dependencies before DIP

Approach 1: An interface (abstraction) of the repository is introduced. The implementation of that interface is another module, and both the service and the repository implementation have direct dependency on the interface. DIP Implementation Approach 1

Approach 2: In this approach, the interface resides in the same package of the service. The diagram http://www.martinfowler.com/eaaCatalog/separatedInterfaceSketch.gif used by Fowler to describe Separated Interface http://www.martinfowler.com/eaaCatalog/separatedInterface.html pattern seems to be also an example of this approach. DIP Implementation Approach 1

我一直在关注方法1因为我使用了 spring 的 JavaConfig,所以服务模块必须对基础设施接口和实现模块都有 ,maven 依赖关系。除了我的@Configuration文件中,绝对没有提及任何基础设施的具体实现。

我目前正在考虑切换到方法2,但显然它不适用于 JavaConfig,因为我最终会在代码中直接引用接口实现模块,从而导致循环依赖,这是像 maven 这样的构建工具无法处理的。

问题是如何配置spring和maven来实现方法2?有什么办法可以问spring扫描组件没有添加为 Maven 依赖项?这需要改变我使用 Maven 的方式吗?


我也有同样的疑问。回复很晚了,但这就是我为 XYZ 项目(扁平化 Maven 风格)想到的:

xyz-service1
    src/main/java/com/example/xyz/service1/Service1.java
xyz-service1-repository1
    src/main/java/com/example/xyz/service1/repository1/Repository1.java (interface)
xyz-file-repository
    src/main/java/com/example/xyz/file-repository/FileRepository.java
    src/main/java/com/example/xyz/file-repository/Repository1Adapter.java
xyz
    src/main/java/com/example/xyz/XyzJavaConfig.java
    src/main/assembly/xyz.bin

依赖树:

xyz
    xyz-service1
        xyz-service1-repository1
    xyz-file-repository
        xyz-service1-repository1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Maven和Spring实现依赖倒置原则 的相关文章

随机推荐

  • 线程安全和非线程安全 PHP Windows 安装包之间有哪些技术差异?

    我目前正准备为基于 Apache Windows 的开发环境安装 PHP 但似乎我即将遇到第一个障碍 选择要安装的正确包 PHP 的可用版本不少于four口味 http windows php net download VC9 x86 非线
  • R:简单乘法导致整数溢出

    在较长的脚本中 我必须将向量 A 的长度 2614 乘以数据帧 B 的行数 1456000 如果我直接这样做length A nrow B 我收到消息NAs produced by integer overflow尽管当我乘以相同的数字时没
  • 如何在spark中读取orc事务hive表?

    如何在spark中读取orc事务hive表 我在通过 Spark 读取 ORC 事务表时遇到问题 我获得了配置单元表的架构 但无法读取实际数据 查看完整场景 hive gt create table default Hello id int
  • Selenium 验证 div 有滚动条

    我正在尝试验证特定的 div 有滚动条 如何使用 Selenium 来做到这一点 元素 div class checkout mini cart Code JavascriptExecutor jsExecutor JavascriptEx
  • 当自动递增列用完时会发生什么?

    考虑一个带有自动增量列的简单表 如下所示 CREATE TABLE foo fooid bigint unsigned NOT NULL auto increment snipped other columns PRIMARY KEY fo
  • 除了静态库本身之外,停止 cmake target_link_libraries 链接静态库的两个目标文件

    我尝试使用 cmake ninja msvc 在 Windows 上构建一个相当大的共享库 它由子文件夹中的多个静态库组成 那么一个根CMakeLists txt好像 project sharedlib CXX include CMAKE
  • 如何检查计费协议是否有效或取消?

    我在 PayPal 中使用参考交易 API 不确定计费时计费协议是否有效 我想提前了解计费协议是否被取消 我想知道计费协议取消电话的回拨电话 要检查计费协议的状态 您可以使用 BAUpdate API NVP METHOD BillAgre
  • R 中 N 个元素与 q 个元素的组合

    I have N 6元素和q 3元素符号为0 1 2 我想创建的所有向量N 6元素与2元素等于0 2元素等于1 and 2元素等于2在所有可能的位置 这些向量的数量等于combn 6 2 combn 4 2 combn 2 2 90 这是构
  • qt中的“morph into”有什么用?

    在qt gui编辑器中 任何gui组件都可以变形为某种类型的其他gui组件 但实际上 这个选项的实际用途是什么 可以动态完成吗 如果是的话那么这样做的好处是什么 实际用途是快速将小部件转换为其他类似的小部件 假设您有一个包含一些小部件的组框
  • Azure 无效 AccessToken

    我正在尝试使用 Microsoft Azure Management Resources 库来管理一些 Azure 资源 我已在 Azure AD 中注册了应用程序 并授予了它所有权限 我获取了它的 ApplicationId 和 Secr
  • 链接器文件中输入和输出部分之间的区别?

    虽然在生成的二进制或 ELF 文件的上下文中可以清楚什么是节 但文档中的许多地方 与所使用的编译器无关 将它们称为输入或输出节 它们之间有什么区别 链接器使用目标文件 以及可能的共享库 并输出 可执行文件或共享库 输入目标文件由命名的 部分
  • 在 Python 2.4 中处理上下文类

    我正在尝试使用 python daemon 模块 它提供 daemon DaemonContext 类来正确地守护脚本 虽然我主要针对 Python 2 6 但我想保持对版本 2 4 的向后兼容性 Python 2 5 支持从以下位置导入上
  • 创建一个接受对象但不接受数组的通用函数

    我想创建一个满足以下条件的通用 TypeScript 函数 f a 1 success f undefined success f should fail the type check f 1 2 should fail the type
  • ImageMagick PATH 无法被knitr 中的engine = "tikz" 识别

    我正在尝试编译 TikZ 图形knitr 我正在使用可用的示例here https github com yihui knitr examples blob master 058 engine tikz Rmd 我专门尝试从 Rstudio
  • 如何防止任务管理器杀死我的程序?

    有什么方法可以保护我的 Delphi 应用程序不被 Windows 任务管理器 或其他类似 Process Explorer 杀死 我认为 Windows 消息可以做到这一点 通过执行挂钩并拦截 TerminateProcess 消息 我想
  • 根据年份而不是最小值或最大值重置序列

    创建一个将根据年份重置的序列 考虑以 000000001 开头的 9 位数字序列 最大值为 999999999 出租日期为 30 12 2017 seq 为 000012849 因此 当日期为 01 01 2018 时 我希望 seq 为
  • WebSocket 在 django 通用中间件中生成错误

    我正在使用 Django gevent socketio Haproxy 所有套接字功能都工作正常 但在后台它会生成如下所示的错误 似乎 Haproxy 的套接字标头具有非常有限的属性 其中不包含 status code 因此它失败并发送错
  • 如何存储每个上下文而不是每个程序的 OpenGL 程序对象的制服?

    我正在开发多线程 OpenGL 合成引擎 我有一组在多个上下文之间共享的着色器 出于性能原因 我想避免为每个线程编译每个着色器程序的单独实例 但是 如果多个线程碰巧使用同一个程序对象 并且我尝试在每个线程上设置不同的统一值 则统一值会混淆
  • 导入/导出项目首选项

    遇到一点问题 由于我们使用的源代码控制设置 每个错误 增强都在新分支中进行 这很好 但是在 Eclipse 中 我们需要为每个分支设置一个新项目 有没有什么方法可以轻松地为项目设置默认首选项 或者在 Eclipse 中导入 导出项目首选项
  • 使用Maven和Spring实现依赖倒置原则

    根据这篇维基百科文章 实现依赖倒置原则 https en wikipedia org wiki Dependency inversion principle DIP implementations可以通过两种方式完成 在单独的包中对低级组件