2010-04-26 17 views
26

Google Guice proporciona algunas excelentes funciones de inyección de dependencias.Características ocultas de Google Guice

me encontré con la característica @Nullable recientemente, lo que le permite marcar argumentos de constructor como opcional (nulo permite) desde Guice no permite esta información por defecto:

por ejemplo,

public Person(String firstName, String lastName, @Nullable Phone phone) { 
    this.firstName = checkNotNull(firstName, "firstName"); 
    this.lastName = checkNotNull(lastName, "lastName"); 
    this.phone = phone; 
} 

https://github.com/google/guice/wiki/UseNullable

¿Cuáles son las otras características útiles de Guice (particularmente en las menos obvias) que usa la gente?

+6

¿Cómo es eso una función escondida? Está en la guía de mejores prácticas, que está a dos clics de la página principal. –

+1

¡Son tres en realidad, si quieres ser pedante al respecto ...! – Jon

Respuesta

39

Ninguno de ellos está destinado a ser escondido, pero estos son mis favoritos '' características de la prima en Guice:

  • Guice puede inject a TypeLiteral<T>, derrotar efectivamente borrado.
  • TypeLiteral puede hacer generic type resolution: Esto le indica que get() en una lista de <cadena> devuelve una cadena iterador < >.
  • Types es una fábrica para implementaciones de interfaces de tipo genérico de Java.
  • Grapher visualiza inyectores. Si su proveedor personalizado implementa HasDependencies, puede aumentar este gráfico.
  • Modules.override() es increíblemente útil en un apuro.
  • Sintaxis abreviada para definir claves parametrizadas: nueva clave < Lista <Cadena> >() {}.
  • Binder.skipSources() le permite escribir extensiones cuyos mensajes de error rastrean correctamente los números de línea.
  • The SPI. Elements.getElements() divide un módulo en átomos y Elements.getModule() los vuelve a juntar.
  • Si implementa equals() y hashCode() en un módulo, puede instalar ese módulo varias veces sin problemas.
13

me gusta cómo abrir totalmente la interfaz Scope es: básicamente, es sólo una transformación Provider-Provider. (De acuerdo, desde Key y Provider)

¿Quiere que algunas cosas sean básicamente Singleton, pero las vuelva a leer desde la base de datos cada media hora? Es fácil hacer un alcance para eso. ¿Desea ejecutar algunas solicitudes en segundo plano y tiene un ámbito que significa que "todas las solicitudes en segundo plano comenzaron a partir de la misma solicitud HTTP"? También es relativamente fácil escribir Scope.

¿Desea realizar un alcance de Key en su servidor durante las pruebas para que use una instancia separada para cada prueba que está ejecutando desde un cliente? (Con la prueba pasando el ID de la prueba en una cookie o un parámetro HTTP adicional) Eso es más difícil de hacer, pero es perfectamente posible, así que someone's already written that for you.

Sí, el abuso excesivo de Scope hará que Jesse empiece a buscar las estacas y los dientes de ajo, pero su asombrosa flexibilidad puede ser realmente útil.

+1

¡Es verdad en ambos aspectos! –

12

Una gran característica de Guice es lo fácil que hace que la implementación de los interceptores de método en cualquier Module, usando:

public void bindInterceptor(
    Matcher<? super Class<?>> classMatcher, 
    Matcher<? super Method> methodMatcher, 
    MethodInterceptor... interceptors); 

Ahora, cualquier método de coincidencia methodMatcher dentro de una clase a juego classMatcher en ese ámbito Module 's es interceptada por interceptors.

Por ejemplo:

bindInterceptor(
    Matchers.any(), 
    Matchers.annotatedWith(Retryable.class), 
    new RetryableInterceptor()); 

Ahora, podemos simplemente anotar cualquier método con @Retryable y nuestra RetryableInterceptor puede reintentar que si falla.