Java 带有参数的自定义Guice绑定注释
我已经成功创建了一个Guice绑定注释,将单线程java.util.concurrent.ExecutorService实例注入构造函数 下面是一个示例用法: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
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);
}