Guice: Как я могу привязать аннотированные синглеты одного и того же класса к разным экземплярам? - PullRequest
1 голос
/ 18 августа 2011

Я хотел бы связать уникальный экземпляр синглтона для каждой аннотации, как показано ниже, так что Client1.a != Client1.b и Client1.a == Client2.a.

class X {}

@Singleton class OneOfEachAnnotation { 
   @Inject OneOfEachAnnotation(X x) { }
}

class Client1 {
   @Inject Client(@A OneOfEachAnnotation a, @B OneOfEachAnnotation b) {}
}

class Client2 {
   @Inject Client(@A OneOfEachAnnotation a, @B OneOfEachAnnotation b) {}
}

Этот ответ , кажется, утверждает, чтоЯ могу выполнить связывание, как это, но когда я это сделаю, Client1.a == Client1.b.

bind(OneOfEachAnnotation.class).annotatedWith(A.class).to(OneOfEachAnnotation.class).in(Singleton.class);
bind(OneOfEachAnnotation.class).annotatedWith(B.class).to(OneOfEachAnnotation.class).in(Singleton.class);

1 Ответ

3 голосов
/ 18 августа 2011

Спасибо Сэму Берлину на форуме Google Groups Guice. Причина, по которой это не работает, заключается в том, что OneOfEachAnnotation уже аннотировано @Singleton. Удаление аннотации @Singleton устраняет проблему.

Сэм объяснил, почему:

Заявления:

bind(OneOfEachAnnotation.class).annotatedWith(A.class).
 to(OneOfEachAnnotation.class).in(Singleton.class);
bind(OneOfEachAnnotation.class).annotatedWith(B.class).
 to(OneOfEachAnnotation.class).in(Singleton.class);

говорят: «Создайте привязку из @A OneOfEachAnnotation до OneOfEachAnnotation и сделайте @A OneOfEachAnnotation синглтоном». То же самое с @B.

Игнорирование @Singleton на OneOfEachAnnotation в течение секунды (при условии, что оно не существует), тогда это будет выглядеть следующим образом:

  • Пользователь вводит OneOfEachAnnotation (без аннотации) несколько раз: каждый раз создается новый, потому что эта привязка не ограничена.

  • Пользователь вводит @A OneOfEachAnnotation, когда он впервые связывается с неотмеченным OneOfEach, видит, что его нужно создать, и создает его. Во второй раз привязка уже подготовлена, поэтому Scopes.SINGLETON больше не переходит к связанной привязке. (То же самое с @B как @A.)

Когда OneOfEachAnnotation имеет @Singleton, то Гис думает, что значение unscoped равно и синглтоном. Поэтому, когда @A ссылается на аннотированный, он создает первый экземпляр. Когда @B связывает аннотированный, Guice замечает, что аннотированная версия, также Singleton, уже создана, и возвращает этот экземпляр.

...