3

有大量關於如何使用Guice Provider綁定到泛型類的在線資源,例如wiki entries like thisSOF questions like this。但是,我無法找到關於如何使用通用本身的提供程序的資源。Guice通用提供程序(提供程序本身是通用的,不是它綁定的類)

例如,可以說我有以下幾點:

public interface Foo { 
    ... 
} 

public class Bar implements Foo { 
    ... 
} 

正如你所看到的,酒吧有一個注射參數,必須在構造函數中。在我的情況下,我們無法將此參數移至字段或方法注入。

因此,現在我想爲Foo編寫一個Provider,但它返回一個Bar實例。事情是這樣的:

@Singleton 
public class FooProvider<T extends Foo> extends Provider<Foo> { 
    @Inject 
    public FooProvider(Object someParameterWeMustInjectIntoConstructor) { 
     ... 
    } 
    ... 
    @Override 
    public Foo get() { 
     return new Bar(...); 
    } 
    ... 
} 

注意這個類是如何依靠吉斯注射本身單身,所以供應商必須使用.toProvider(FooProvider.class)進行配置。我們也只能使用構造函數注入,而不能使用方法或字段注入,這可能是因爲該提供者具有類型層次結構。

我想找到某種方式是使用.toProvider(FooProvider<Bar>.class),但我們都知道這是無效的Java語法。有誰知道我如何在模塊中使用Guice活頁夾的.toProvider(Class<? extends Provider>)方法,以便我可以使用通用提供程序來創建具體的實現類?讓我知道我的問題是否有點混亂。

+0

你必須使用反射 – Johan

+0

目前尚不清楚爲什麼你使用'FooProvider 擴展的供應商'而是說:'FooBarProvider擴展提供 {...返回新酒吧(...); }'。如果你真的需要這樣的事情,你能否詳細說明*爲什麼*你需要它? –

+0

我接受的答案是我正在尋找的:) – ecbrodie

回答

7
toProvider(new TypeLiteral<FooProvider<Bar>>() { }); 
+0

'toProvider'需要一個'Provider',而不是'TypeLiteral'。 –

+0

我站好了! –

+0

無法及時找出鏈接語法,讓我們嘗試[this](http://google-guice.googlecode.com/git/javadoc/com/google/inject/binder/LinkedBindingBuilder.html#toProvider%28com)。 google.inject.TypeLiteral%3C?%20extends%20javax.inject.Provider%3C?%20extends%20T%3E%3E%29)。 –

相關問題