是否可以在@Provides 之上使用自定义注释而不是@Named?

Is it possible to use custom annotations instead of @Named in top of @Provides?

假设我们想要@Inject个字符串。我创建 Module:

public class StringModule extends AbstractModule{
    @Provides
    String black() {
        return "black";
    }

    @Provides
    String white() {
        return "white"
    }
}

现在我要求输入值:

@Inject
private String wantWhiteHere;

显然 Guice 会抛出错误,因为绑定不明确。我知道如果我像这样使用 @Named 注释,我可以获得 white

public class StringModule extends AbstractModule{
    @Named("black")
    @Provides
    String black() {
        return "black";
    }

    @Named("white")
    @Provides
    String white() {
        return "white"
    }
}

然后:

@Named("white")
@Inject
private String iGotWhiteHere;

但我想要的是:

public class StringModule extends AbstractModule{
    @Black
    @Provides
    String black() {
        return "black";
    }

    @White
    @Provides
    String white() {
        return "white"
    }
}

.

@White
@Inject
private String tryingToGetWhiteHere;

这可能吗? 当我这样做时出现异常:

A binding to java.lang.String was already configured...

有什么地方可以配置来实现它吗?

我的 Guice 版本是 4.2.3

使用@Qualifier

是的,这是可能的。确保您有以下声明:

@javax.inject.Qualifier
@Target({ FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface White { }

您可以在 Guice 的官方 wiki 上找到 more info