![](/img/trans.png)
[英]Difference between synchronized(Singleton.class) and synchronized(obj)
[英]Guice: differences between Singleton.class and @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.SINGLETON
, asEagerSingleton
, @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
實例。 如您所見,每個鍵都是不同的,如果只有接口與Singleton綁定,Guice將允許多個實現實例。 如果您只注入A
和B
接口,則行為看起來相同,但如果從同一個Injector注入接口和實現,您可能會看到不同的行為。
@Provides
方法也有類似的邏輯:
C
將始終返回相同的CImpl
實例。 CImpl
將每次創建一個新的CImpl
,除非CImpl
沒有可注入的公共零參數構造函數 - 然后注入將失敗。 D
將始終返回相同的DImpl
實例。 DImpl
將每次返回一個新實例,每個實例將與D
返回的實例不同。 E
將每次返回相同的EImpl
實例。 EImpl
也將檢索相同的實例E
注入。 這提供了一些靈活性。 想象一下假設的Cache
,它保留了一定數量的最近檢索的對象,你希望@User Cache
和@Product Cache
都是可注入的。 如果你bind(Cache.class).in(Singleton.class)
,你將在對象之間共享一個Cache(和任何裸的Cache
注入),而如果你bind(Cache.class).annotatedWith(User.class).to(Cache.class).in(Singleton.class)
然后帶注釋的鍵保存在單例范圍內,每個對象類型都有自己的緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.