java - java Guice: Singleton.class 和 @Singleton 之间的差异

  显示原文与译文双语对照的内容

在Guice中,什么是不同的?


//Inside your AbstractModule subclass:


@Override


public void configure() {


 bind(Service.class).to(ServiceImpl.class).in(Singleton.class);


}



还有:


@Override


public void configure() {


 bind(Service.class).to(ServiceImpl.class);


}



@Provides @Singleton


public ServiceImpl providesService() {


 return new ServiceImpl();


}



它们都是一样的? 什么时候你会用一个和另一个? 先谢谢了。

时间:

他们的价格几乎为。 @Singleton 语法对于注释 @Provides 方法非常有用,或者对类本身( 虽然我更喜欢在模块中保留作用域注释) 进行注释。

其中的区别在于哪个键标记为单 Singleton,它与相对于 Singleton.class ( 。或者 Scopes.SINGLETONasEagerSingleton@Singleton 类注释或者 toInstance 隐式单例) 更少,而与默认语法相比,它的作用更简单。 例如:


public class MyModule extends AbstractModule {


 @Override public void configure() {


 bind(A.class).to(AImpl.class).in(Singleton.class);



 bind(B.class).to(BImpl.class);


 bind(BImpl.class).in(Singleton.class);


 }



 @Provides @Singleton C provideC() { return new CImpl(); }



 @Provides @Singleton D provideD(DImpl dImpl) { return dImpl; }



 @Provides E provideE(EImpl eImpl) { return eImpl; }


 @Provides @Singleton EImpl provideEImpl() { return new EImpl(); }


}



上面我们将接口 A 绑定到类 AImpl,接口 B 为类 BImpl,但行为是不同的:

  • 注入 A 每次都会检索相同的AImpl 实例。
  • 每次注入 AImpl 将检索不同的AImpl,它们都与 A 实例不同。
  • 注入 B 每次都会检索相同的BImpl 实例。
  • 注入 BImpl 也将检索 B 注入的相同 BImpl 实例。

如你所见,每个键都是不同的,如果只有接口绑定到一个单独的实例,dwr就允许。 如果只注入 AB 接口,行为看起来相同,但是如果插入接口和实现,则可以能会发生异常。

类似的逻辑适用于 @Provides 方法:

  • 注入 C 总是返回相同的CImpl 实例。
  • 注入 CImpl 将每次都创建一个新的CImpl,除非 CImpl 没有注射的public constructor—then注入将失败。
  • 注入 D 总是返回相同的DImpl 实例。
  • 每次注入 DImpl 将返回一个新实例,每个实例都将与 D 返回的不同。
  • 注入 E 每次都会返回相同的EImpl 实例。
  • 注入 EImpl 也将检索相同的实例 E 注入。

这提供了一些灵活性。假设一个假设的Cache 保持了一定数量的most-recently-retrieved对象,你希望可以使用 @User Cache@Product Cache 。 如果你 bind(Cache.class).in(Singleton.class) ,则在对象的( 还有任何裸露的Cache 注射) 之间共享一个缓存,而如果 bind(Cache.class).annotatedWith(User.class).to(Cache.class).in(Singleton.class) 然后注释键保存在单独的范围中,每个对象类型都有自己的缓存。

...