2011-04-18 115 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