provides dependency-injection guice

dependency injection - provides - Características ocultas de Google Guice



guice provides (3)

Google Guice proporciona algunas funciones de inyección de gran dependencia.

Encontré la función @Nullable recientemente, que te permite marcar los argumentos del constructor como opcionales (permitiendo nulo) ya que Guice no los permite de forma predeterminada:

p.ej

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 las menos obvias) que usa la gente?


Me gusta lo totalmente abierta que está la interfaz de Scope : básicamente, es solo una transformación de Provider a Provider . (De acuerdo, de Key y Provider a Provider )

¿Quiere que algunas cosas sean básicamente Singleton, pero volver a leerlas 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 "todas las solicitudes en segundo plano iniciadas desde la misma solicitud HTTP"? Es relativamente fácil escribir ese Scope también.

¿Desea definir algunas 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 que pasa la identificación de la prueba en una cookie o un parámetro HTTP adicional) Eso es más difícil de hacer, pero es perfectamente posible y alguien ya lo ha escrito para usted .

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


No se pretende que ninguno de ellos esté oculto, pero estas son mis ''funciones extra'' favoritas en Guice:


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

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

Ahora, cualquier método que coincida con methodMatcher dentro de una clase que coincida con classMatcher en el classMatcher de ese Module es interceptado por interceptors .

Por ejemplo:

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

Ahora, podemos simplemente anotar cualquier método con @Retryable y nuestro RetryableInterceptor puede reintentarlo si falla.