2015-07-21 20 views
7

Sto cercando di capire come utilizzare l'integrazione delle dipendenze in Play Framework 2.4. Conosco i principi generali, ma non capisco le implicazioni per il design. Il mio ragionamento generale è stato, i metodi statici nelle classi controller sono troppo simili all'utilizzo di variabili globali e questo può facilmente causare problemi con la sicurezza dei thread, ecc. Quindi, dal momento che Play ora incoraggia a passare a un'iniezione di dipendenza, dovrei cambiare anche io.Iniezione framework java dependency Play - quando utilizzare i singleton

Ciò di cui sono confuso è quale buona pratica è in questo contesto. Quando leggo Play docs ufficiali, si parla brevemente di injection dependency e quindi cita prontamente un'annotazione @Singleton. E l'esempio disponibile (http://www.typesafe.com/activator/template/play-guice) parla anche di una classe "WelcomeTextGenerator" singleton.

Quindi mi chiedo, dovrei usare gli oggetti singleton come sembrano suggerire gli esempi? Se questo è il caso, qual è il vantaggio rispetto al vecchio metodo statico? Esistono tipi di oggetto specifici (ad esempio, controller?) Che dovrebbero essere singleton e ci sono implicazioni di performance nel non contrassegnare oggetti come singleton?

risposta

6

Quindi mi chiedo, dovrei usare gli oggetti singleton come sembrano suggerire gli esempi? Se questo è il caso, qual è il vantaggio rispetto al vecchio metodo statico?

L'iniezione di dipendenza è una tecnica per collegare un'applicazione. Scrivi componenti che non dipendono direttamente l'uno dall'altro. Invece si iniettano i componenti l'uno con l'altro. In questo modo puoi semplicemente scambiare parti intere della tua applicazione senza toccare una sola riga di codice. L'iniezione di dipendenza è particolarmente utile quando si tratta di test di unità di scrittura.

Rispetto ai metodi statici è possibile utilizzare tutto ciò che è di fantasia OOP. La domanda è fondamentalmente "quali sono gli svantaggi di metodi statici?"

ci sono tipi di oggetti specifici (ad esempio, i controllori?) Che dovrebbero essere single, e ci sono implicazioni di prestazioni di non marcatura oggetti come single?

Riproduzione o più specificatamente Guice creerà un nuovo oggetto ogni volta che una dipendenza viene iniettata per impostazione predefinita. Marcandoli come @Singleton creerà solo un oggetto e riutilizzerà lo stesso identico oggetto su tutte le iniezioni. In altre parole: Singletons salva la creazione di oggetti e la garbage collection, ma richiede la sincronizzazione per inizializzare l'oggetto.

Per venire alla tua domanda quando usare @Singleton, come regola generale (source):

  • oggetti stateful, come la configurazione o contatori
  • oggetti che sono costosi da costruire o di ricerca
  • oggetti che vincolano le risorse, ad esempio un pool di connessione al database.

Guice offre un completo documentation a proposito. Consiglio vivamente di navigare tra un po 'di tempo.

+1

Grazie - questo è quello di cui avevo bisogno. Ho trovato molto utile la pagina "Scopes" a cui hai collegato.Non era ovvio per me dalla documentazione di Play perché "singleton" fosse evidenziato, o che ci fossero altre opzioni - questo ha molto più senso. – myrosia

+0

Dopo un po 'più di ricerca, un potenziale avvertimento: la pagina "Scopes" Guice parla di Scope di richiesta e Session Scope, ma come meglio posso dire, Play non supporta quelli, perché non usa l'implementazione del contenitore servlet di Google e non fornire il proprio al momento. Quindi in questo senso la pagina dei documenti può essere fuorviante, perché non chiarisce la dipendenza dell'implementazione. – myrosia

Problemi correlati