[英]Create multiple instances of the same class with Guice
對不起,如果這是一個微不足道的問題,我是Guice的新手。 假設我有以下課程:
public class MyClass {
@Inject
public MyClass(final MyDependency myDependency) {
this.name = myDependency.getName();
}
public String getName() {
this.name;
}
}
然后我想做的其他地方:
public class SomeOtherClass {
public void test() {
MyClass instanceFoo = injector.getInstance(MyClass.class);
MyClass instanceBar = injector.getInstance(MyClass.class);
assertTrue("foo", instanceFoo.getName());
assertTrue("bar", instanceBar.getName());
}
}
我想有兩個“MyClass”實例,一個名為“foo”,一個名稱為“bar”(即每個實例都有一個不同的依賴實例)。 如何將這兩個實例添加到我的注入器中,如何使用“injector.getInstance”檢索每個實例?
我不想為每個可能的依賴項創建“MyClass”的子類。
謝謝!
您的問題(如標題中)有一個更簡單的解決方案:如果您需要任意數量的MyClass或MyDependency實例,則可以注入Provider<MyClass>
或Provider<MyDependency>
。 無論您是否實際綁定了模塊中的提供程序,都是如此; 對於圖中可用的任何T,Guice實際上可以注入T
或Provider<T>
。 (它們分別對應於Injector.getInstance
和Injector.getProvider
。)
正如在問題的主體中,有兩個部分:為同一個Class
多個可注入的Key
,並以不同的名稱和注入的依賴項的方式設置實例。
Guice使用Key
標識綁定, Key
是一個完全限定的類(如MyClass
或List<MyClass>
),並結合可選的“綁定注釋”。 這是一個注釋,它本身用BindingAnnotation
或javax.inject.Qualifier
注釋; 你可以創建自己的,或使用內置的一個名為@Named
的字符串(因此@Named("foo")
與@Named("bar")
)。
大多數情況下,您可以直接使用Key:在bind
調用中使用annotatedWith
或將注釋添加到@Provides
方法,並通過將注釋放在構造函數參數或@Inject-annotated字段來請求它們。 但是,您仍然可以通過使用Key上的靜態方法手動創建Key來使用getInstance
和getProvider
。 (對於復雜的情況,請使用TypeLiteral或Names.named
;有關詳細信息,請參閱其文檔。)
既然你知道如何注入@Named("foo") MyClass
或@Foo MyClass
,你如何提供它們? 根據您的需要,我選擇以下三個選項之一:綁定到toInstance
,使用@Provides
方法或創建“輔助注入”工廠。
如果您的MyClass實例本身不需要注入,並且您不改變或操縱實例狀態,則可以准備根據需要命名的實例,然后bind
它們與toInstance
bind
。
您還可以編寫一個@Provides @Named("foo") MyClass
方法,該方法接受一個MyClass
參數(Guice通過注入器提供),設置名稱並返回實例。 這是編寫Provider類或實例的低開銷替代方法,它將為您提供一個新實例,而不是toInstance
綁定所暗示的共享。
如果你真的希望name
是你的類的構造函數參數的一部分,也許為了保持實例不可變,你可以使用“輔助注入”來告訴Guice你自己提供哪些參數以及哪些來自Guice注入器。 這將允許您注入MyClass.Factory
並調用myClassFactory.create("foo")
,您可以直接在您的消費類中執行,或使用上面的@Provides
技術。 詳細信息有點超出了問題的范圍,但查看“Assisted Injection”以獲取有關語法和添加適當JAR的詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.