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:
- Guice puede inyectar un TypeLiteral <T> , lo que anula la eliminación efectiva.
- TypeLiteral puede hacer una resolución de tipo genérica : esto le dice que get () en una Lista <String> devuelve un Iterador <String>.
- 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 caso de apuro.
- Sintaxis corta para definir claves parametrizadas: nueva clave <Lista <String>> () {}.
- Binder.skipSources() permite escribir extensiones cuyos mensajes de error rastrean los números de línea correctamente.
- El SPI . Elements.getElements() divide un módulo en átomos y Elements.getModule() los vuelve a unir.
- Si implementa equals () y hashCode () en un módulo, puede instalar ese módulo varias veces sin problema.
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.