在Guice模块中获取实例

Getting an instance within a Guice Module

我有这个班级:

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()真的在幕后调用getInstance()的impl吗?
问题作者:snekse
采纳答案:

提供者方法允许注入参数。 传递给此方法的StoreAuthorizer将是模块中的单例绑定。 如果你自己调用构造函数,Guice不会做任何不可思议的事情。

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

顺便说一句,你可能想要考虑使用Guice Multibindings扩展来创建一个Set<SecurityAuthorizer>而不是自己做这个。

答案作者:colind

参考更多解答:Getting an instance within a Guice Module,转载请保留在Guice模块中获取实例

更多:singleton