簡體   English   中英

使用Guice創建同一個類的多個實例

[英]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實際上可以注入TProvider<T> (它們分別對應於Injector.getInstanceInjector.getProvider 。)

正如在問題的主體中,有兩個部分:為同一個Class多個可注入的Key ,並以不同的名稱和注入的依賴項的方式設置實例。

鍵和綁定注釋

Guice使用Key標識綁定, Key是一個完全限定的類(如MyClassList<MyClass> ),並結合可選的“綁定注釋”。 這是一個注釋,它本身用BindingAnnotationjavax.inject.Qualifier注釋; 你可以創建自己的,或使用內置的一個名為@Named的字符串(因此@Named("foo")@Named("bar") )。

大多數情況下,您可以直接使用Key:在bind調用中使用annotatedWith或將注釋添加到@Provides方法,並通過將注釋放在構造函數參數或@Inject-annotated字段來請求它們。 但是,您仍然可以通過使用Key上的靜態方法手動創建Key來使用getInstancegetProvider (對於復雜的情況,請使用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.

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