2011-04-18 102 views
8

我已經成功創建了一個Guice綁定註釋,以將單線程java.util.concurrent.ExecutorService實例注入到構造函數中。帶參數的自定義Guice綁定註釋

這裏有一個例子用法:

public class ContainsSingleThreadedExecutorService { 


    private final ExecutorService executorService; 

    @Inject 
    public ContainsSingleThreadedExecutorService(@SingleThreaded ExecutorService executorService) { 

     this.executorService = executorService; 
    } 

} 

我現在想創建多線程執行者類似的註釋,在註釋中指定的線程池大小。例如:

public class ContainsMultiThreadedExecutorService { 


    private final ExecutorService executorService; 

    @Inject 
    public ContainsMultiThreadedExecutorService(@MultiThreaded(poolSize = 5) ExecutorService executorService) { 

     this.executorService = executorService; 
    } 

} 

有沒有人知道我如何從Guice Provider中訪問「poolSize」參數的值?

回答

2

NamedImpl,實現@Named和方法Names.named()。我認爲你應該有相同的實現。

更新 Guice 通過hashCode()比較註釋。所以,如果你不使用@MultiThreaded(poolSize = 5)你應該在實例化之前映射它。這似乎是骯髒的解決方法,但你可以寫成smt像

for (int i = 1; i < 20; i++){ 
     bind(ExecutorService.class).annotatedWith(Qualifiers.withValue(i)).toProvider(new DependencyProvider(i)); 
    } 

如果你想這樣做。請記住,您的MultiThreadedImpl應以正確的方式覆蓋hashCode。它可能是像

@Override 
public int hashCode() { 
    return (127 * "poolSize".hashCode())^value; 
} 
+0

這並沒有真正回答這個問題。 – ColinD 2011-04-18 15:14:06

+0

@murungu,@ColinD更新 – 2011-04-18 19:07:58

7

你不能。這不是如何使用綁定註釋來使用...該參數僅用於區分與@MultiThreaded(poolSize = 5)綁定的ExecutorService與與@MultiThreaded(poolSize = 2)綁定的綁定。這不是幫助配置Provider的元數據。

如果你注入了一些註解爲@MultiThreaded(poolSize = 5)的東西,你需要用註釋@MultiThreaded(poolSize = 5)註釋。如果您想要更改所有這些地方使用的游泳池大小,則需要在綁定遊戲的位置以及注入的所有位置將poolSize = 5更改爲poolSize = 4。這對我來說沒有多大意義。

而不是通過綁定ExecutorService來確定它們在線程池中有多少個線程,而應該根據您想要使用它們的內容來綁定它們。然後你可以調整每個人在一個地方使用的線程數量。

2

你可以用Guice做這種事情(我曾經做過這個事情),但是Guice確實需要知道它的約束力。所以,你需要做的是這樣的:

for (int i=1; i < 100; i++) { 
    ExecutorService svc = Executors.newFixedThreadPool(i); 
    bind (ExecutorService.class).annotatedWith(new MultiThreadedImpl(i)).toInstance(svc); 
} 

(或者更可能的,綁定到懶洋洋地初始化提供者)。

這很醜陋,你可能實際上並不想這樣做。僅僅使用@Named並且有一些ExecutorService實例更加有用,無論如何,這些ExecutorService實例都與特定事物的名稱綁定在一起 - 然後您可以配置在一個地方使用多少個線程,而不必擔心「是否有人使用73線程的ExecutorService?」

1

是的,你可以。沒有迭代器所有情況。

其實,我有幾乎像你的一樣的問題。 Here是我的答案和問題,與我所有的代碼。 我只知道如何處理字段不參數,但我認爲這不是一個大問題,對不對?

跟隨CustomInjections在維基上你將會知道如何。

+0

你好,我現在很忙,但我會看看乳清我有時間,並接受你的答案,如果它的工作! – murungu 2014-06-13 09:02:08