2011-12-07 173 views
1

我有兩個Runnable類,我想注入它們之間的依賴關係,以便SecondProcedure使用由FirstProcedure創建的Table運行。使用註釋的Guice方法注入

class FirstProcedure implements Runnable { 
    private Table composers = new Table(); 

    public void run() { 
     // populates the composers table 
    } 

    public Table getComposers() { 
     return composers; 
    } 
} 


class SecondProcedure implements Runnable { 
    private Table composers; 

    public void run() { 
     // writes the name of each composer to the console 
    } 

    public Table setComposers(final Table composers) { 
     this.composers = composers; 
    } 
} 

的想法是,在我的主類可以實例化兩者的程序,注入相關的表(應該正確地引用,即使它不會被這點來填充),制定之間的依賴關係兩個程序,然後以正確的順序運行它們。即這兩個過程中每個過程都會有一個獨特的實例(但我有意避免Singleton(反)模式,以便我可以進行適當的單元測試)。

我該如何去使用Guice? 我可以註釋setComposers法的東西,如:

@InjectTable(procedure=FirstProcedure.class, name="composers") 
public Table setComposers(final Table composers) { 
    this.composers = composers; 
} 

,並具有將結合在SecondProcedureTable基礎上,提供現場的類別和名稱的吉斯模塊?

我在AbstractModulebind()方法中沒有看到任何符合此範例的東西。

(除了這個,我不是在設計這個註釋本身過於熱衷,在字符串領域之中,而不是指方法明確莫名其妙的名字。)

回答

0

我想你可能會使問題過於複雜。

看起來SecondProcedure對錶一個簡單的依賴:

class SecondProcedure { 
    @Inject 
    SecondProcedure(Table table) { 
    this.table = table; 
    } 
} 

而且FirstProcedure是表的提供者:

class FirstProcedure implements Provider<Table> { 
    public Table get() { 
    return buildTheTable(); 
    } 
} 

然後你的模塊只需要提供商綁定:

class SomeModule extends AbstractModule { 
    protected void configure() { 
    bind(Table.class).toProvider(FirstProcedure.class); 
    } 
} 

@Inject帶註釋的構造函數的JIT綁定將提供SecondProcedure,so你不需要明確地綁定它。

完成此操作後,您可能會考慮將FirstProcedure的名稱更改爲TableProvider。

要使用FirstProcedure,你那麼就注入,或者從注射器得到它:

injector.getInstance(FirstProcedure.class).run(); 

順便說一句,在吉斯單件模式(@辛格爾頓範圍)是不是一個反模式,因爲它是侷限於注射器。在很多情況下,Guice單例實現並不妨礙測試。

也許你應該關心的是靜態。 Guice本身提供了一個很好的解釋,爲什麼它很糟糕:http://code.google.com/p/google-guice/wiki/AvoidStaticState