如何获得提供商提供独特的实例?

时间:2014-08-24 14:37:08

标签: java guice

我有一个对象A执行一些重要的加载。我使用它的提供者。我有对象B需要A进行初始化。但是在一个对象C中,我希望传递A和B,做好准备。

是否可以让提供者一直返回同一个实例,或者guice模块是否可以保留该实例并在那里停止?

编辑:

我在guice网站上有以下几点解释:

@Provides @Singleton
TransactionLog provideTransactionLog() {
  ...
}

这是解决方案吗?单身人士是否适用于提供者或提供者。如果它适用于提供者那么,解决方案是保留一个实例并每次返回它。但这不适用于提供方法。 有什么帮助吗?

1 个答案:

答案 0 :(得分:5)

Guice的核心非常统一。在内部,它完全基于提供商。链接绑定,实例绑定,提供者绑定,即时绑定,@Provides - 绑定 - 事实上,每种绑定都将始终生成一个提供者。因此范围注释不能应用于提供者,它只是没有意义。范围始终分配给实际注入的对象,因此您可以确定如果将一些绑定放入@Singleton范围,实际注入的对象总是是同样,不管这种约束的种类。

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

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();
    }
}