自定义Guice绑定注释与参数

mur*_*ngu 8 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

public class ContainsMultiThreadedExecutorService {


    private final ExecutorService executorService;

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

        this.executorService = executorService;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Col*_*inD 7

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

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

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


Sta*_*lin 2

看看NamedImpl那个工具@Named和方法Names.named()。我认为你应该有相同的实施。

更新 Guice 通过 hashCode() 比较注释。因此,如果您不使用,@MultiThreaded(poolSize = 5) 则应该在实例化之前映射它。这似乎是肮脏的解决方法,但你可以这样写 smt

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

如果你想这样做。请记住,您应该以正确的方式MultiThreadedImpl覆盖。hashCode它可能像 smt

@Override
public int hashCode() {
    return  (127 * "poolSize".hashCode()) ^ value;
}
Run Code Online (Sandbox Code Playgroud)