2013-03-20 54 views
1

我試圖從Spring遷移到Guice以進行依賴注入。這裏是從Spring XML配置的樣本片段:Google Guice - 如何將參數傳遞給第三方庫工廠類

<bean id="connectionFactory" class="org.somethirdparty.MyConnectionFactory"> 
    <property name="connectionUrl" value="${urls.connectionUrl}"/> 
    <property name="ackMode" value="unordered"/> 
    <property name="timeout" ref="timeoutBean"/> 
</bean> 

<bean id="timeoutBean" class="java.lang.Integer"> 
    <constructor-arg value="10000"/> 
</bean> 

我首先要弄清楚如何參數MyConnectionFactory與谷歌吉斯掙扎。我不能註釋'MyConnectionFactory'的構造函數或方法,因爲這是由第三方庫提供的類。

讀完Guice FAQ之後,我認爲唯一的選擇是爲工廠做一個工廠?這對我來說似乎很愚蠢!

+0

仍然沒有這個問題的接受者? :( – 2013-03-21 04:35:11

回答

2

您可能需要爲MyConnectionFactory創建一個Factory,但前提是您確實需要在運行時更改傳遞給MyConnectionFactory的參數。否則,你可以通過製作一個Provider - 畢竟這是一個工廠 - 我猜 - 或者它更苗條的表弟the @Provides Method。 (我猜有問題的類採用非特異性或原始參數,要不然toConstructor binding是另一種可能性。)

工廠應該是這樣的:

public class MyConnectionFactoryFactory { 
    @Inject Provider<SomeDependency> someDependencyProvider; 

    public MyConnectionFactory create(String url) { 
    return new MyConnectionFactory(someDependencyProvider.get(), url, 10000); 
    } 
} 

該供應商將看起來相同,不同之處它會執行Provider<MyConnectionFactory>create而不是零參數get()。您可以通過bind(MyConnectionFactory.class).toProvider(MyConnectionFactoryProvider.class)進行綁定。

但是,如果你知道在配置時所有構造函數的參數,你同樣可以創建你的模塊一個@Provides方法,它應該是這樣的:

public class MyModule extends AbstractModule { 
    @Override public void configure() { /* your configuration here */ } 

    /* FYI: a @Provides method by any other name would return as sweet */ 
    @Provides MyConnectionFactory getConnectionFactory(SomeDependency dependency) { 
    return new MyConnectionFactory(dependency, url, 10000); 
    } 
} 

...這需要你的「包裝代碼「樣板到三個額外的非空白行。請記住,Guice會自動將X,0 Provider<X>@Provides X的任意組合自動綁定到自動爲您注入XProvider<X>的任何組合,因此可以自由綁定,但最方便。

+0

非常感謝,我似乎誤解了@Provides的用法,你的第二個例子正是我想要做的,實質上是在配置時從文件加載屬性並將它們傳遞到工廠。 – 2013-03-23 07:46:36

相關問題