Java 我应该创建多个单例上下文还是引用我的状态和对象的单例上下文?

Java 我应该创建多个单例上下文还是引用我的状态和对象的单例上下文?,java,architecture,singleton,guice,Java,Architecture,Singleton,Guice,我正在一个项目中使用Guice。由于这是第一次,我想知道如何保持和传递状态,即包含一些用户输入的对象或其他地方需要的长寿命对象(不是第一次注入的地方) 例如,我的应用程序有一个服务器,用户可以启动和停止它。此外,用户可以输入一些数据,这些数据导致需要保存在内存中的状态 目前,我看到两种可能性: 拥有一个范围为@Singleton的上下文类,以及一些对保持我的状态并为我提供某些功能的其他类的引用。 上下文类将允许我访问服务器实例、用户数据、其他服务等。 Guice可以注入上下文的实例。 因此,如果

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

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

目前,我看到两种可能性:

  • 拥有一个范围为
    @Singleton
    上下文
    类,以及一些对保持我的状态并为我提供某些功能的其他类的引用。
    上下文
    类将允许我访问
    服务器
    实例、用户数据、其他服务等。 Guice可以注入
    上下文的实例。
    因此,如果我想停止服务器,我需要
    上下文
    作为依赖项(而不是服务器)
  • 这有点违背了Guice网站上的建议(注入直接依赖项,而不是使用链式getter访问“真正的”依赖项)

  • @Singleton
    注释所有应该只存在一次并注入其他几个类中的类。所以,我只有一个单例服务器,在某个地方有一个包含用户数据的类,等等
  • 单例模式(GoF)被认为是糟糕的设计。因此,我想知道我是否应该尽量减少使用
    @Singleton
    ,或者这是一个不同的故事,通常使用Guice依赖注入


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

    我想你的大多数问题都与依赖注入范式有关。首先,使用DI并不意味着每个托管bean都应该是单例的。托管bean有自己的生命周期。它们可以在每个访问/请求/会话上实例化,也可以是单例的

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

    例如,在您的例子中,如果您需要一个bean中的服务对象,那么您就有了这两个类之间的关系,而不需要有与上下文的关系

    如果不同用户插入的数据对所有用户都可见,那么在应用程序中使服务成为单例服务。如果每个用户的服务器bean的状态不同,那么请设置bean会话的作用域,以允许每个用户拥有自己的服务器bean。

    单例模式(GoF)与单例作用域不同。反对singleton模式的参数通常不适用于singleton范围。