Java 带有参数的自定义Guice绑定注释

Java 带有参数的自定义Guice绑定注释,java,multithreading,dependency-injection,guice,Java,Multithreading,Dependency Injection,Guice,我已经成功创建了一个Guice绑定注释,将单线程java.util.concurrent.ExecutorService实例注入构造函数 下面是一个示例用法: public class ContainsSingleThreadedExecutorService { private final ExecutorService executorService; @Inject public ContainsSingleThreadedExecutorService(@S

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

下面是一个示例用法:

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提供程序访问“poolSize”参数的值吗?

看看实现
@Named
和方法
Names.Named()
NamedImpl
。我认为您应该有相同的实现

已更新 圭斯 按hashCode()比较注释。因此,如果您不使用
@multi-threaded(poolSize=5)
,您应该在实例化之前映射它。这似乎是一个肮脏的解决办法,但你可以像这样编写smt

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

你不能。这不是绑定注释的用途。。。该参数仅用于区分与
@multi-threaded(poolSize=5)
绑定的
执行器服务与与与
@multi-threaded(poolSize=2)
绑定的执行器服务。它不是帮助配置
提供程序的元数据

如果您使用
@multi-threaded(poolSize=5)
注入带注释的内容,则需要使用注释
@multi-threaded(poolSize=5)
绑定内容。如果随后要更改在所有这些位置使用的池大小,则需要在绑定池的位置和注入池的所有位置将
poolSize=5
更改为
poolSize=4
。这对我来说没什么意义


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

你可以用Guice做这类事情(我曾经几乎就是这么做的),但是Guice确实需要事先知道它绑定了什么。因此,您需要执行以下操作:

for (int i=1; i < 100; i++) {
  ExecutorService svc = Executors.newFixedThreadPool(i);
  bind (ExecutorService.class).annotatedWith(new MultiThreadedImpl(i)).toInstance(svc);
}
for(int i=1;i<100;i++){
ExecutorService svc=Executors.newFixedThreadPool(i);
bind(ExecutorService.class).annotatedWith(新的多线程模板(i)).toInstance(svc);
}
(或者更可能的是,绑定到延迟初始化它的提供程序)


这已经够难看的了,你可能根本不想这么做。更有用的是,只使用@Named,并拥有几个ExecutorService实例,这些实例与它们所擅长的特定事物的名称相关联——这样,您就可以配置在一个位置使用了多少线程,而不必怀疑“有人在使用73线程ExecutorService吗?”

是的,您可以。在所有情况下都不使用迭代器。

事实上,我的问题和你的差不多。 是我的答案和问题,还有我所有的代码。 我只知道如何处理字段而不是参数,但我认为这不是一个大问题,对吗


关注维基,你会知道怎么做。

这根本不能回答问题。你好,我现在很忙,但我会在有时间的时候看一看,如果你的答案有效,我会接受的!!
for (int i=1; i < 100; i++) {
  ExecutorService svc = Executors.newFixedThreadPool(i);
  bind (ExecutorService.class).annotatedWith(new MultiThreadedImpl(i)).toInstance(svc);
}