自定义Guice绑定注释与参数

我已经成功创建了一个Guice绑定注释,将单线程java.util.concurrent.ExecutorService实例注入到构造函数中。

这是一个示例用法:

public class ContainsSingleThreadedExecutorService { private final ExecutorService executorService; @Inject public ContainsSingleThreadedExecutorService(@SingleThreaded ExecutorService executorService) { this.executorService = executorService; } } 

我现在想为multithreading执行程序创建一个类似的注释,在注释中指定ThreadPool大小。 例如:

 public class ContainsMultiThreadedExecutorService { private final ExecutorService executorService; @Inject public ContainsMultiThreadedExecutorService(@MultiThreaded(poolSize = 5) ExecutorService executorService) { this.executorService = executorService; } } 

有没有人知道如何从Guice提供程序访问“poolSize”参数的值?

你不能。 这不是打算如何使用绑定注释…该参数仅用于区分与@MultiThreaded(poolSize = 5)绑定的ExecutorService@MultiThreaded(poolSize = 5)绑定的一个@MultiThreaded(poolSize = 2) 。 它不是帮助配置Provider元数据。

如果你注入了用@MultiThreaded(poolSize = 5)注释的@MultiThreaded(poolSize = 5) ,你需要用注释@MultiThreaded(poolSize = 5)绑定一些东西。 如果您想要更改在所有这些位置使用的池大小,则需要在绑定它的位置和注入它的所有位置将poolSize = 5更改为poolSize = 4 。 这对我来说没什么意义。

不是通过它们在线程池中有多少线程来绑定ExecutorService ,而是应该根据你想要使用它们的方式绑定它们。 然后,您可以调整每个人在一个地方使用的线程数。

查看实现@NamedNames.named()方法的Names.named() 。 我认为你应该有相同的实现。

UPDATED 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 。 它可能像smt一样

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

你可以用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实例更有用,这些实例与他们适合的特定事物的名称相关联 - 然后你可以配置在一个地方使用多少线程,而不是不得不怀疑“有人使用73线程的ExecutorService吗?”

是的你可以。 没有迭代器的所有情况。

实际上,我有像你一样的问题。 这是我的答案和问题,包括我的所有代码。 我只知道如何处理字段而不是参数,但我认为这不是一个大问题,对吧?

在Wiki中关注CustomInjections ,你会知道如何。