Можно ли использовать собственные аннотации вместо @Named в верхней части @Provides? - PullRequest
1 голос
/ 14 апреля 2020

Предположим, мы хотим @Inject Строки. Я создаю Module:

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

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

и теперь запрашиваю введенное значение:

@Inject
private String wantWhiteHere;

Очевидно, Guice выдаст ошибку, поскольку привязка неоднозначна. Я знаю, что могу получить white, если я использую аннотацию @Named так:

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;

Возможно ли это? Когда я делаю это, исключение:

Привязка к java. lang.String уже настроен ...

Есть ли что-нибудь, что я могу настроить для достижения этого?

Моя версия Guice 4.2.3

1 Ответ

2 голосов
/ 14 апреля 2020

Использование @Qualifier

Да, это возможно. Убедитесь, что у вас есть следующее объявление:

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

Вы можете найти дополнительную информацию на официальной вики Guice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...