我有一个对象A执行一些重要的加载。我使用它的提供者。我有对象B需要A进行初始化。但是在一个对象C中,我希望传递A和B,做好准备。
是否可以让提供者一直返回同一个实例,或者guice模块是否可以保留该实例并在那里停止?
编辑:
我在guice网站上有以下几点解释:
@Provides @Singleton
TransactionLog provideTransactionLog() {
...
}
这是解决方案吗?单身人士是否适用于提供者或提供者。如果它适用于提供者那么,解决方案是保留一个实例并每次返回它。但这不适用于提供方法。 有什么帮助吗?
答案 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();
}
}