Java 如何让guice向提供程序提供唯一实例?

Java 如何让guice向提供程序提供唯一实例?,java,guice,Java,Guice,我有一个物体A,它做一些重要的加载。我使用一个提供者。我有一个对象B,它的初始化需要A。然而,在一个对象C中,我想通过A和B,正确地准备 有没有可能让提供者始终返回同一个实例,或者让guice模块保持提供的实例并立即停止 编辑: 我在guice网站上有以下几点说明: @Provides @Singleton TransactionLog provideTransactionLog() { ... } 这就是解决方案。单例是否适用于提供程序或提供的。如果它适用于提供者,那么解决方案将是保留一

我有一个物体A,它做一些重要的加载。我使用一个提供者。我有一个对象B,它的初始化需要A。然而,在一个对象C中,我想通过A和B,正确地准备

有没有可能让提供者始终返回同一个实例,或者让guice模块保持提供的实例并立即停止

编辑:

我在guice网站上有以下几点说明:

@Provides @Singleton
TransactionLog provideTransactionLog() {
  ...
}
这就是解决方案。单例是否适用于提供程序或提供的。如果它适用于提供者,那么解决方案将是保留一个实例并每次返回它。但这在提供方法的情况下是行不通的。
有什么帮助吗?

Guice的核心非常统一。在内部,它完全基于提供商。链接绑定、实例绑定、提供程序绑定、即时绑定,
@提供了
——绑定——事实上,每种类型的绑定——都会在幕后生成一个提供程序。因此,范围注释不能应用于提供者,它只是没有意义。作用域始终被分配给实际注入的对象,因此您可以确保,如果您将一些绑定放入
@Singleton
作用域中,实际注入的对象将始终是相同的,而不管这种绑定的类型如何

因此,这些绑定中的每一个都将始终为您提供完全相同的唯一对象(当然,您不能将所有这些绑定都放在模块中;请选择您最喜欢的一个):


Guice的核心非常统一。在内部,它完全基于提供商。链接绑定、实例绑定、提供程序绑定、即时绑定,
@提供了
——绑定——事实上,每种类型的绑定——都会在幕后生成一个提供程序。因此,范围注释不能应用于提供者,它只是没有意义。作用域始终被分配给实际注入的对象,因此您可以确保,如果您将一些绑定放入
@Singleton
作用域中,实际注入的对象将始终是相同的,而不管这种绑定的类型如何

因此,这些绑定中的每一个都将始终为您提供完全相同的唯一对象(当然,您不能将所有这些绑定都放在模块中;请选择您最喜欢的一个):


非常感谢您富有洞察力的解释!!!非常清楚。不过,有一点我不太清楚。最后一个例子。它是否对应于实现您自己的提供者类的情况?@MaatDeamon,您的意思是
@提供了
方法吗?不,这些方法是在模块中定义的。提供者仅通过其
get()
方法返回新对象。自定义提供程序的例子是倒数第二个,它使用Java8Lambda语法。我用scala编写代码,这样语法对我来说就可以了。我找到了提供程序方法。只有在guice文档中才有。您可以拥有实现提供程序接口的提供程序方法或类。我以为你在做最后一个例子。我只是不明白你上一个例子是什么意思。我就是不明白。在一个模块中,假设您有一个configure方法。给你。最后一个例子与我在guice中所知道的完全不同。@MaatDeamon,不,你弄错了。提供者方法应该在模块中定义,请参阅。他们的目的是作为全面供应商的短期替代品。我的错。一切都很好,谢谢你的解释,一切都澄清了:)非常感谢你富有洞察力的解释!!!非常清楚。不过,有一点我不太清楚。最后一个例子。它是否对应于实现您自己的提供者类的情况?@MaatDeamon,您的意思是
@提供了
方法吗?不,这些方法是在模块中定义的。提供者仅通过其
get()
方法返回新对象。自定义提供程序的例子是倒数第二个,它使用Java8Lambda语法。我用scala编写代码,这样语法对我来说就可以了。我找到了提供程序方法。只有在guice文档中才有。您可以拥有实现提供程序接口的提供程序方法或类。我以为你在做最后一个例子。我只是不明白你上一个例子是什么意思。我就是不明白。在一个模块中,假设您有一个configure方法。给你。最后一个例子与我在guice中所知道的完全不同。@MaatDeamon,不,你弄错了。提供者方法应该在模块中定义,请参阅。他们的目的是作为全面供应商的短期替代品。我的错。一切都很好,谢谢你的解释一切都搞定了:)
bind(SomeDependency.class).to(SomeDependencyImpl.class).in(Singleton.class);

bind(SomeDependency.class).toInstance(new SomeDependencyImpl());

bind(SomeDependency.class).toProvider(() -> new SomeDependencyImpl()).in(Singleton.class);

public class SomeModule extends AbstractModule {
    @Provides @Singleton
    SomeDependency someDependencyImpl() {
        return new SomeDependencyImpl();
    }
}