自定义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
,而是应该根据你想要使用它们的方式绑定它们。 然后,您可以调整每个人在一个地方使用的线程数。
查看实现@Named
和Names.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 ,你会知道如何。
- 通过Producer类将RequestScoped CDI Bean注入ApplicationScoped CDI Bean
- 使用没有Servlet容器的CDI
- 记录和dependency injection
- Jersey2,Hk2dependency injection(自动)给出AbstractMethodError:org.jvnet.hk2.internal.DynamicConfigurationImpl.addIdempotentFilter
- 注释驱动的dependency injection,处理不同的环境
- 使用guice作为注入类的框架,正确的初始化方法?
- Spring单例和Java singeleton(设计模式)有什么区别?
- OpenEJB本地客户端注入失败
- Spring:构造函数注入具有基于注释的配置的原始值(属性)