2011-03-16 7 views
5

que tienen esta clase:Obtención de una instancia dentro de un módulo de Guice

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

quiero para inyectar el campo authorizers un valor List<SecurityAuthorizer>.

En mi módulo, Tengo el siguiente:

@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; 
} 

Mi pregunta está incrustado en los comentarios de código. Cuando estoy añadiendo a StoreAuthorizer que List<SecurityAuthorizer>:

  • ¿Cómo me aseguro que es la misma instancia que otros StoreAuthorizer referencias?
  • ¿Es algo que Guice está haciendo bajo el capó, por lo que new StoreAuthorizer() realmente está llamando a una impl de getInstance() detrás de escena?

Respuesta

8

Los métodos del proveedor permiten argumentos inyectados. El StoreAuthorizer pasado al método aquí será el enlace único en su módulo. Guice no puede hacer nada mágico si llamas a un constructor tú mismo.

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

Como acotación al margen, es posible que desee considerar el uso de la extensión Guice Multibindings para crear un Set<SecurityAuthorizer> en lugar de hacer esto por sí mismo.

+0

Me olvidé de MultiBinder. Entonces algo como esto? Multibinder securityBinder = Multibinder.newSetBinder (Binder(), SecurityAuthorizer.class); securityBinder.addBinding(). To (StoreAuthorizer.class); – Snekse

+0

@Snekse: Sí, algo así. – ColinD

+0

Opps, parece que Multibinder no es compatible con Gin. http://code.google.com/p/google-gin/issues/detail?id=111 – Snekse

Cuestiones relacionadas