java - 我应该创建许多单例或单例上下文来引用我的状态和对象吗?

标签 java architecture singleton guice

我在项目中使用 Guice。由于这是第一次,我想知道如何保持和传递状态,即包含一些用户输入的对象或其他地方需要的长期对象(而不是第一次注入(inject)的地方)。

例如,我的应用程序有一个用户可以启动和停止的服务器。此外,用户可以输入一些数据,这些数据导致需要保存在内存中的状态。

目前我看到两种可能性:

  1. 有一个范围为 @SingletonContext 类和一些对其他类的引用,这些类保持我的状态并为我提供某些功能。 Context 类可以让我访问 Server 实例、用户数据、其他服务等。 Context 的实例可以由 Guice 注入(inject)。 因此,如果我想停止我的服务器,我需要 Context 作为依赖项(而不是服务器)。

这有点违背 Guice 网站上的建议(注入(inject)直接依赖项而不是使用链式 getter 访问“真实”依赖项)。

  1. @Singleton 注释所有类,这些类应该只存在一次并被注入(inject)到其他几个类中。因此,我将只有一个单例服务器,某处有一个包含用户数据的类等。

单例模式 (GoF) 被认为是糟糕的设计。因此,我想知道我是否应该尽量减少 @Singleton 的使用,或者这是否是一个不同的故事,通常使用 Guice 分别依赖注入(inject)。

还有其他可能性或更好的方法吗?

最佳答案

我认为您的大部分问题都与依赖注入(inject)范例有关。首先,使用 DI 并不意味着每个托管 bean 都应该是 Singleton。托管 bean 有自己的生命周期。它们可以在每次访问/请求/ session 时实例化或作为单例实例化。

您应该关心的另一件事是我们通常使用 DI 连接我们的主要应用程序设计。你应该考虑你的域对象及其关系而不是 DI(Guice/Spring)。

例如,在您的情况下,如果您需要 bean 中的服务对象,那么您就拥有这两个类之间的关系,而无需与 Context 建立关系!

如果不同用户插入的数据对所有用户都是可见的,那么在您的应用程序中将服务设为单例。如果每个用户的 Server bean 的状态不同,那么将 bean Session 的范围设置为允许每个用户都有自己的 Server bean。

关于java - 我应该创建许多单例或单例上下文来引用我的状态和对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27193082/

相关文章:

java - 为 "(5+x)"等字符串创建 regExp

java - 如果并开始时出现错误

Java spring 表单复选框

java - Windows 操作系统命令不在 Spring Shell 中执行

architecture - 如何导致用户进程的 TLB 抖动?

architecture - 你如何让人们重视抽象和灵活性超过 "just getting it done"?

design-patterns - 域类中的 HTML 格式化

c# - 最终静态是否自动采用惰性实例化?

iOS Swift 新用户在应用程序终止并启动之前无法登录

c++ - 如何实现类似 "single instance"的设计?