Спасибо Сэму Берлину на форуме 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, уже создана, и возвращает этот экземпляр.