2010-04-26 2 views
26

Google Guice offre alcune funzionalità di iniezione di grande dipendenza.Funzioni nascoste di Google Guice

mi sono imbattuto la funzione @Nullable di recente, che consente di contrassegnare argomenti del costruttore come optional (null permettendo) dal Guice non consente questi per impostazione predefinita:

esempio

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

Quali sono le altre caratteristiche utili di Guice (in particolare quelli meno evidenti) che la gente usa?

+6

Come è una funzionalità nascosta? È nella guida alle best practice che è a due clic dalla pagina principale. –

+1

In realtà sono tre, se vuoi essere pedante al riguardo ...! – Jon

risposta

39

Nessuno di 'em sono destinati ad essere nascosto, ma questi sono i miei preferiti dai contenuti speciali' in Guice:

  • Guice può inject a TypeLiteral<T>, sconfiggendo in modo efficace la cancellazione.
  • TypeLiteral può fare generic type resolution: questo vi dice che get() su una lista <String> restituisce un iteratore <String>.
  • Types è una fabbrica per l'implementazione di interfacce di tipo generico Java.
  • Grapher visualizza iniettori. Se il tuo fornitore personalizzato implementa HasDependencies, può aumentare questo grafico.
  • Modules.override() è incredibilmente maneggevole in un pizzico.
  • Sintassi breve per la definizione delle chiavi parametrizzate: nuova chiave < Lista <Stringa> >() {}.
  • Binder.skipSources() consente di scrivere estensioni i cui messaggi di errore tracciano correttamente i numeri di riga.
  • The SPI. Elements.getElements() interrompe un modulo in atomi e Elements.getModule() li rimette insieme.
  • Se si implementa equals() e hashCode() in un modulo, è possibile installare quel modulo più volte senza problemi.
13

Mi piace come totalmente aperto l'interfaccia Scope è: in fondo, è solo una trasformazione Provider-Provider. (Va bene, da Key a Provider)

Vuoi che alcune cose siano fondamentalmente Singleton, ma rileggono dal database ogni mezz'ora? È facile fare uno scopo per questo. Vuoi eseguire alcune richieste in background e avere un ambito che significa "tutte le richieste in background avviate dalla stessa richiesta HTTP?" È relativamente facile scrivere anche quello Scope.

Si desidera eseguire alcune operazioni su Key sul server durante i test in modo che utilizzi un'istanza separata per ogni test eseguito da un client? (Con il test che passa l'id di test in un cookie o un parametro HTTP extra) è più difficile da fare, ma è perfettamente possibile e quindi someone's already written that for you.

Sì, l'abuso eccessivo di Scope farà sì che Jesse inizi a dare la caccia ai pali e agli spicchi d'aglio, ma la sua incredibile flessibilità può essere davvero utile.

+1

Vero su entrambi i fronti! –

12

Una grande caratteristica di Guice è quanto sia facile rende l'implementazione del metodo intercettori in qualsiasi Module, utilizzando:

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

Ora, qualsiasi metodo di corrispondenza methodMatcher all'interno di una classe corrispondente classMatcher in tale ambito Module s' è intercettato da interceptors.

Ad esempio:

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

Ora, possiamo semplicemente annotare qualsiasi metodo con @Retryable e la nostra RetryableInterceptor può riprovare se non riesce.