簡體   English   中英

Guice:Singleton.class和@Singleton之間的差異

[英]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方法或標注類本身(盡管我寧願保持內部模塊我的作用域注釋)。

不同之處在於,其鍵標有辛格爾頓 ,其中有少做@SingletonSingleton.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實例。

如您所見,每個鍵都是不同的,如果只有接口與Singleton綁定,Guice將允許多個實現實例。 如果您只注入AB接口,則行為看起來相同,但如果從同一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM