2010-08-02 7 views

risposta

11

Bene, creazione di un nuovo oggetto è il più esplicito possibile: si crea una nuova istanza della classe desiderata.

Iniezioni di dipendenza è un meccanismo che fornisce riferimenti dove è necessario. Immagina una classe che rappresenti un pool di connessioni al tuo database: di solito hai solo un'istanza di quella classe. Ora è necessario distribuire tale riferimento a tutte le classi che lo utilizzano. Qui è dove Dipendenza iniezione è utile - utilizzando un framework DI come Spring è possibile definire che l'istanza del pool verrà iniettata nelle classi che ne hanno bisogno.

tua domanda in sé non è facile rispondere in quanto la creazione di un oggetto e l'iniezione di dipendenza non può essere paragonata così facilmente ...

+2

Come è diverso dall'usare un Singleton? – Radu

+0

@Radu a Singleton è un modello di progettazione che limita il numero di istanze di una classe specifica a un massimo di uno. Quindi la creazione dell'istanza fa parte dell'implementazione del modello. Il singleton non viene iniettato nei punti in cui ne hai bisogno, questo è quello che ti serve per l'iniezione di dipendenza. – f1sh

+1

La mia domanda è come questa singola istanza della classe che viene "magicamente" istanziata e distribuita meglio di una chiamata a SingletonClass.getSingleInstance(). Questa iniezione di dipendenze mi sembra ridondante se si ha solo 1 istanza, basta usare il modello singleton. – Radu

2

Quando si utilizza un contenitore di inversione di controllo per eseguire l'iniezione di dipendenza, il contenitore crea gli oggetti e non lo sviluppatore. Questo è fatto in modo che il contenitore possa "iniettare" questi oggetti in altri oggetti.

Suggerirei di leggere alcuni articoli sull'iniezione di dipendenza e/o sulla primavera. Oppure leggi altri argomenti sull'integrazione delle dipendenze qui su SO.

+0

suggerire qualche collegamento .. – TaherT

13

Naturalmente entrambi creare oggetti. La differenza sta in chi è responsabile della creazione. È la classe che ha bisogno delle sue dipendenze o di un contenitore come Spring, ad esempio, che collega le dipendenze dei componenti. Configurare le dipendenze in un file di configurazione separato (in genere XML).

È davvero una separazione di preoccupazioni. La classe dice che ho bisogno di questo, questo e questo componente in modo che funzioni correttamente. Alla classe non importa come ottiene i suoi componenti. Li inserisci nella classe con un file di configurazione separato.

Per darvi un esempio, prendiamo in considerazione l'idea di avere una classe commerciale che necessita di un modulo di pagamento. Non si desidera hardcode quale modulo di pagamento verrà utilizzato. Per ottenere ciò, si inversione del controllo. È possibile modificare il modulo di pagamento utilizzato con poche sequenze di tasti nel file di configurazione del contenitore. Il potere è che non stai toccando alcun codice Java.

9

Beh, non sono esattamente paragonabili. Dovrai sempre creare un nuovo oggetto creando un'istanza di una classe ad un certo punto. L'iniezione di dipendenza richiede anche la creazione di nuovi oggetti.

L'iniezione delle dipendenze entra davvero in gioco quando si desidera controllare o verificare il comportamento delle istanze utilizzate da una classe che si utilizza o si desidera testare. (Per la dipendenza da Test Driven Development l'iniezione è la chiave per qualsiasi eccetto l'esempio più piccolo).

Assumere un supporto di classe che richiede un oggetto di classe Maniglia. Il modo tradizionale per farlo sarebbe quello di lasciare che l'istanza Titolare creare e possederlo:

esempio
class Holder { 
    private Handle myHandle = new Handle(); 
    public void handleIt() { 
     handle.handleIt(); 
    } 
} 

Il titolare crea myHandle e nessuno al di fuori della classe può arrivare a esso. In alcuni casi, non avendo a che fare con l'unittest, questo è un problema perché non è possibile testare la classe Holder senza creare l'istanza di Handle che a sua volta potrebbe dipendere da molte altre classi e istanze. Ciò rende la verifica ingombrante e ingombrante.

Iniettando l'istanza Handle, ad esempio nel costruttore, qualcuno dall'esterno diventa responsabile della creazione dell'istanza.

class Holder { 
    private Handle myHandle; 

    public Holder(Handle injectedHandle) { 
     myHandle = injectedHandle; 
    } 

    public void handleIt() { 
     handle.handleIt(); 
    } 
} 

Come si può vedere il codice è quasi lo stesso, e il manico è ancora privata, ma la classe Holder ha ora un accoppiamento perdente molto alla sua mondo esterno che rende molte cose più semplici. E quando si prova la classe Holder, è possibile iniettare un oggetto finto o stub anziché un'istanza reale che consente di verificare o controllare l'interazione tra il titolare, il chiamante e l'handle.

L'iniezione effettiva avverrebbe in un altro luogo, di solito un programma "principale". Ci sono diverse strutture che possono aiutare a farlo senza programmazione, ma essenzialmente questo è il codice nel programma "principale":

... 
private Handle myHandle = new Handle(); // Create the instance to inject 
private Handler theHandler = new Handler(myHandle); // Inject the handle 
... 

In sostanza, l'iniezione non è altro che un metodo di fantasia set. E, naturalmente, è possibile implementare il meccanismo di iniezione usando quello invece del costruttore come il semplice esempio sopra.

+0

Ho appena effettuato l'accesso a questa versione, è decisamente migliore di quella accettata e la spiegazione è un modo corretto. – Anearion

+0

Ma come il 'injectedHandle' viene inizializzato fuori dal nostro controllo quando creiamo un' Holder'? Cosa succede se ci sono più parametri, come sapere come inizializzarli o non inizializzarli affatto? – Yoda

+0

@ Yoda, aggiunta una descrizione di come eseguire l'iniezione effettiva. Spero possa aiutare. – thoni56

1

Iniezioni di dipendenza aggiunge un livello di configurabilità all'applicazione. Nel senso, quando costruisci oggetti di codice, devi ricostruire e ridistribuire la tua app, ma quando usi dependency injection, puoi riconfigurare l'XML e cambiare il comportamento senza ricostruire e ridistribuire. Ci sono una grande varietà di casi d'uso in cui questo può risparmiare un sacco di legami e sforzi.

Problemi correlati