发现循环依赖问题

2024-04-09

我正在设计一个系统,其中有两个模块,一个用于管理文件,另一个用于用户。对于某些逻辑运算,它们需要彼此提供的服务。

每个模块都由一个单例表示,该单例实现一个相互提供一些服务的接口,并通过抽象工厂来提供它们,如下所示:

public class UserMain implements UserInternalService {

/*
 * Internal interfaces
 */
/**
 * Allows interaction with the projects database.
 */
FilesInternaService fileSystem;

/**
 * Constructor is private, as this is a singleton.
 */
protected UserMain() {
}

private static UserMain singleton = null;

/**
 * Singleton factory. Returns a reference to the singleton. If there is no
 * reference yet, creates it.
 */
protected static synchronized UserMain getReference() {
    if (singleton == null) {
        singleton = new UserMain();
        singleton.fileSystem = FileMain.getInternalService();
    }
    return singleton;
}

/**
 * Factory method for the singleton as a UserInternalService
 */
public static UserInternalService getUserInternalService() {
    return getReference();
}

}

文件模块主类如下所示:

public class FileMain implements FilesInternaService{

/**
 * Interface to user subsystem for request validation, etc.
 */
UserInternalService userSystem;

/**
 * Creation of instances aside from singleton disallowed.
 */
protected FileMain(){};

private static FileMain singleton = null;

/**
 * Singleton factory.
 * Returns a reference to the singleton.
 * If there is no reference yet, creates it.
 */
protected synchronized static FileMain getReference(){
    if(singleton == null)
        singleton = new FileMain();
        singleton.userSystem = UserMain.getUserInternalService();
    return singleton;
}

/**
 * Abstract factory for Internal Services singleton.
 * @return
 */
public static FilesInternaService getInternalService(){
    return getReference();
}
}

我不完全确定我是否正确处理了循环依赖。 有什么办法可能会意外中断吗?

EDIT:正如下面已经回答的那样,处理这个问题的正确方法是注入。然而,处理这个问题的正确方法不是我在这里问的,而是这个特定的解决方案如何崩溃。


处理此问题的简洁方法是使用依赖项注入,将依赖项保留在接口级别。

没关系UserMain依赖FilesInternaService没关系FileMain依赖UserInternalService;但这不行UserMain依赖FileMain or for FileMain依赖UserMain。也就是说,不能依赖于具体的实现。

一个实例FilesInternaService应注入UserMain和一个实例UserInternalService应注入FileMain.


参考

  1. 循环依赖是否被认为是糟糕的设计? https://stackoverflow.com/questions/9173494/are-circular-dependencies-considered-bad-design
  2. 为什么循环引用被认为是有害的? https://stackoverflow.com/questions/1897537/why-are-circular-references-considered-harmful
  3. https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references
  4. https://softwareengineering.stackexchange.com/questions/306483/how-to-solve-circular-dependency https://softwareengineering.stackexchange.com/questions/306483/how-to-solve-circular-dependency
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发现循环依赖问题 的相关文章

  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet

随机推荐

  • 减少负载后 Kubernetes HPA 不会缩小规模

    当 pod 负载增加时 Kubernetes HPA 可以正常工作 但负载减少后 部署规模不会改变 这是我的 HPA 文件 apiVersion autoscaling v2beta2 kind HorizontalPodAutoscale
  • React Typescript Material-UI useStyles 不可调用

    由于某种原因 我无法调用 useStyles 因为它会出错 This expression is not callable Type never has no call signatures ts 2349 const useStyles
  • 工具栏后退单击在 Xamarin android 中不起作用

    我创建了带有后退箭头的工具栏 单击不起作用 toolbar FindViewById
  • 是否可以在 Access 2010 中创建视图?

    正如标题所说 能做到吗 我在 MSDN 页面上读到 这不受支持 但我的作业请求如何支持 可以吗 怎样才能做到呢 视图只不过是保存的 SQL SELECT 语句 这就是 Access 中保存的查询 当然 您也可以保存 DML SQL 语句 在
  • session.clear() 在 Hibernate 中如何工作

    我参考了很多文章 但我仍然不清楚什么session clear在休眠状态下执行 据我目前了解到的情况来看 当我们使用批量保存 更新时如下图 Session session SessionFactory openSession Transac
  • 由此可以得出 lambda 表达式吗?

    I know from f in list where f bar someVar select f 可以写成 list Where f gt f bar someVar 是否可以创建类似的表达式 from f in foo from b
  • 对对象列表进行排序的最简单方法

    我有一个 A 类型的对象列表 在第一次迭代中 我为每个对象分配一个双精度值 0 目前 我使用一个包装类来存储对象及其 x 值来制作可比较的列表 Scala 是否提供了一种数据类型 允许我执行以下操作 var result new Sorte
  • 附加到条形码应用程序中多个按钮的侦听器中出现异常

    好的 我正在开发一款内部条形码扫描仪 供我的公司在移动计算机和设备时使用 经过一番尝试和错误后 我目前几乎已经通过 Intent 设置了 Zxing 条码扫描仪 这就是我正在尝试做的事情 旁边三个EditText我有三个领域ImageBut
  • android AsyncTask xml解析

    我尝试在 AsyncTask 中解析一个大的 xml 文档 FeinstaubActivity 启动 但我只看到黑屏 然后返回到 RSSReaderActivity 从我启动另一个 Activity 的地方开始 Log DEBUG Sntp
  • 如何在gradle java构建脚本中访问环境变量

    如何在 gradle java 构建脚本中访问环境变量 用户级别或系统级别 我是 gradle 新手 我正在尝试使用 gradle 构建我的项目 目前我已经硬编码了第三方 jar 的路径 如下面的脚本所示 repositories flat
  • 首先在子级的父级上关闭alertDialog Android removeView()

    我想关闭 关闭警报对话框 但是当我单击按钮时valider我遇到了这个错误 我不知道哪些视图给我带来了问题 即使我的视图中没有方法删除视图 layout or v java lang IllegalStateException The sp
  • Imagick PHP 扩展 -- Montage 有帮助吗?

    我在使用 Imagick PHP 扩展生成图像时遇到了一些问题 一切工作正常 除了我的以下 蒙太奇 有白色背景 因此我不能将其覆盖在其他东西之上 如何生成具有透明背景的蒙太奇 Montage Icons gt montageImage ne
  • 如何在多租户系统中的 RabbitMQ 中使队列私有/安全?

    我已阅读开始使用 http www rabbitmq com getstarted htmlRabbitMQ 提供的指南 甚至还贡献了第六个示例暴风雨 amqp https github com paolo losi stormed amq
  • 如何计算不在列表中的日期

    我有一个位于客户的两个日期 date1 date2 之间的数据框以及到达日期 date1 lt 2019 07 29 date2 lt 2019 08 08 clients lt data frame id c 1 10 arrive c
  • 在 Python 中使用多个列表的 For 循环[重复]

    这个问题在这里已经有答案了 我正在寻找解决我的问题的方法 目前我有两个元素列表 column width 3 3 6 8 4 4 4 4 fade 100 200 300 我想要实现的是创建 for 循环 它将给出以下输出 column 3
  • 随机生成密码 Rails 3.1

    为了开发一个新的网络应用程序 我的注册页面 仅限管理员 只需要一个电子邮件字段 问题是我对 Rails 完全陌生 所以即使是像这样的基础知识对我来说也非常困难 我使用 Railscast 270 创建了我的身份验证 它使用有安全密码方法 现
  • Java 中最快的循环同步是什么(ExecutorService、CyclicBarrier、X)?

    哪种 Java 同步结构可能提供最好的 并发 迭代处理场景的性能 像下面概述的那样固定数量的线程 实验后 我自己呆了一段时间 使用 ExecutorService 和 CyclicBarrier 并且 对结果有些惊讶 我会感激一些 专家建议
  • 比较对象 - 单独的侧列

    是否可以显示PowerShell的结果Compare Object在两列中显示参考对象与差异对象的差异 例如使用我当前的命令行 Compare Object Base Test Gives InputObject SideIndicator
  • 在电子邮件中嵌入图片

    我目前有一个程序 可以从列表中随机选择报价并通过电子邮件发送 我现在也尝试在电子邮件中嵌入图像 我遇到了一个问题 我可以附加电子邮件 但我的报价不再有效 我在网上研究过 但解决方案对我不起作用 请注意 我使用的是 Python 3 2 2
  • 发现循环依赖问题

    我正在设计一个系统 其中有两个模块 一个用于管理文件 另一个用于用户 对于某些逻辑运算 它们需要彼此提供的服务 每个模块都由一个单例表示 该单例实现一个相互提供一些服务的接口 并通过抽象工厂来提供它们 如下所示 public class U