自定义Guice绑定注释与参数

时间:2011-04-18 15:05:39

标签: java multithreading dependency-injection guice

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

这是一个示例用法:

public class ContainsSingleThreadedExecutorService {


    private final ExecutorService executorService;

    @Inject
    public ContainsSingleThreadedExecutorService(@SingleThreaded ExecutorService executorService) {

        this.executorService = executorService;
    }

}

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

public class ContainsMultiThreadedExecutorService {


    private final ExecutorService executorService;

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

        this.executorService = executorService;
    }

}

有没有人知道如何从Guice Provider访问“poolSize”参数的值?

4 个答案:

答案 0 :(得分:7)

你做不到。这不是如何使用绑定注释...该参数仅用于区分与ExecutorService绑定的@MultiThreaded(poolSize = 5)与绑定@MultiThreaded(poolSize = 2)的绑定。这不是帮助配置Provider的元数据。

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

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

答案 1 :(得分:2)

查看实施NamedImpl和方法@Named的{​​{1}}。我认为你应该有相同的实现。

<强>已更新 吉斯  通过hashCode()比较注释。所以,如果你不使用Names.named(),你应该在实例化之前映射它。这似乎是一种肮脏的解决方法,但你可以写像smt一样

@MultiThreaded(poolSize = 5)

如果你想这样做。请注意,您的 for (int i = 1; i < 20; i++){ bind(ExecutorService.class).annotatedWith(Qualifiers.withValue(i)).toProvider(new DependencyProvider(i)); } 应该以适当的方式覆盖MultiThreadedImpl。它可能像smt一样

hashCode

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

答案 3 :(得分:1)

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

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

在wiki中关注CustomInjections,您就会知道如何。