Guice - 相同返回类型的多个提供者方法

3
在我的模块中:
@Provides
@Singleton
public ExecutorService provideExecutorService(){
    return new ExecutorService(config);
}

在我的课堂上:
@Inject
private ExecutorService executorService;

现在,我需要两个具有不同配置的ExecutorService实例:
@Provides
@Singleton
public ExecutorService provideExecutorServiceA(){
    return new ExecutorService(configA);
}

@Provides
@Singleton
public ExecutorService provideExecutorServiceB(){
    return new ExecutorService(configB);
}

如果我想在我的类中为使用configB创建的ExecutorService注入依赖,我该如何操作?
1个回答

6
你可以使用绑定注解(binding annotations):
@Provides
@Singleton
@Priority(Priority.Level.HIGH)
public static ReportingDal createHighPriorityReportingDal(DataSource dataSource,
                                                          DatabaseType databaseType,
                                                          ReportingQueryGenerator queryGenerator)
{
    return new ReportingDalImpl(dataSource, databaseType, Queue.DEFAULT, queryGenerator);
}

@Provides
@Singleton
@Priority(Priority.Level.LOW)
public static ReportingDal createLowPriorityReportingDal(DataSource dataSource,
                                                         DatabaseType databaseType,
                                                         ReportingQueryGenerator queryGenerator)
{
    return new ReportingDalImpl(dataSource, databaseType, Queue.MAINTENANCE, queryGenerator);
}

@Priority注解如下:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@BindingAnnotation
public @interface Priority
{
    Level value();

    public enum Level
    {
        LOW,
        HIGH
    }
}

请注意,如果您不想实现自定义注释,可以使用内置于Guice的@Named注释。您可以像这样在类中使用它:
@Inject
public ReportingJob(@Priority(Priority.Level.LOW) ReportingDal dal)
{
    this.dal = dal;
}

编辑

或者,如果您通过私有字段进行注入:

@Inject
@Priority(Priority.Level.LOW)
private ReportingDal dal;

谢谢。如果我通过私有字段进行注入(如问题中所述),我该怎么做? - Raj
1
哎呀,我读得有点太快了。我编辑了我的答案以显示私有字段注入。 - jrochette
@ema,你需要在你的模块中绑定你的提供者,并且将你的Provider注入到类中,而不是注入ExecutorService - Chetan Kinger
这个答案没有 @Named 注解的实际例子。 - shafeen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接