Получение экземпляра в модуле Guice - PullRequest
5 голосов
/ 16 марта 2011

У меня есть этот класс:

public class CompositeSecurityAuthorizer implements SecurityAuthorizer {
    @inject @CompositeSecurityAuthorizerAnnot
    List<SecurityAuthorizer> authorizers; //Field Injection
}

Я хочу ввести в поле authorizers значение List<SecurityAuthorizer>.

В моем модуле у меня есть следующее:

@Override
protected void configure() {
  bind(CompositeSecurityAuthorizer.class).in(Singleton.class);
  bind(StoreAuthorizer.class).in(Singleton.class);
  bind(SecurityAuthorizer.class)
      .annotatedWith(CompositeSecurityAuthorizerAnnot.class)
      .to(CompositeSecurityAuthorizer.class);
}

@Provides @CompositeSecurityAuthorizerAnnot
List<SecurityAuthorizer> provideAuthorizersList()
{
    List<SecurityAuthorizer> authList = new ArrayList<SecurityAuthorizer>();
    //How do I add StoreAuthorizer while maintaining a Singleton?
    //Will the line below do it through Guice magic?
    //authList.add(new StoreAuthorizer());
    return authList;
}

Мой вопрос встроен в комментарии к коду.Когда я добавляю StoreAuthorizer к этому List<SecurityAuthorizer>:

  • Как мне убедиться, что это тот же экземпляр, что и другие ссылки StoreAuthorizer?
  • Это что-то, что Guice просто делает под капотом, так что new StoreAuthorizer() действительно вызывает impl getInstance() за кулисами?

1 Ответ

8 голосов
/ 16 марта 2011

Методы провайдера позволяют вводить аргументы.StoreAuthorizer, переданный методу здесь, будет синглтоном, связанным в вашем модуле.Guice не делает и не может делать ничего волшебного, если вы сами вызываете конструктор.

@Provides @CompositeSecurityAuthorizerAnnot
List<SecurityAuthorizer> provideAuthorizersList(StoreAuthorizer storeAuthorizer)
{
    List<SecurityAuthorizer> authList = new ArrayList<SecurityAuthorizer>();
    authList.add(storeAuthorizer);
    return authList;
}

В качестве отступления вы можете рассмотреть возможность использования расширения Guice Multibindings для создания Set<SecurityAuthorizer> вместоэто сам.

...