我在项目中使用 Guice。由于这是第一次,我想知道如何保持和传递状态,即包含一些用户输入的对象或其他地方需要的长期对象(而不是第一次注入(inject)的地方)。
例如,我的应用程序有一个用户可以启动和停止的服务器。此外,用户可以输入一些数据,这些数据导致需要保存在内存中的状态。
目前我看到两种可能性:
- 有一个范围为
@Singleton
的Context
类和一些对其他类的引用,这些类保持我的状态并为我提供某些功能。Context
类可以让我访问Server
实例、用户数据、其他服务等。Context
的实例可以由 Guice 注入(inject)。 因此,如果我想停止我的服务器,我需要Context
作为依赖项(而不是服务器)。
这有点违背 Guice 网站上的建议(注入(inject)直接依赖项而不是使用链式 getter 访问“真实”依赖项)。
- 用
@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/