# Dependency Injection



## johndearmusik (13. Nov 2015)

Hey Community, 
ich bin neu hier und habe auch direkt eine Frage an euch.

Könnt ihr mir den Unterschied zwischen der Field-, Constructor-, Method Injection erklären.
Im Internet finde ich nur sehr theoretische Erklärungen.
Könnte mir jemand das gut verständlich erklären ?

Danke euch schonmal im vorraus.

Gruß Johndearmusik


----------



## stg (13. Nov 2015)

Beziehst du dich auf Dependency Injection allgemein? 

So allgemein, wie die Frage jedenfalls gestellt ist, kann man nicht sehr viel dazu sagen. Der Unterschied besteht hauptsächlich darin, wann und wie die Injection stattfindet. 
Je nachdem wann man bereits auf die Abhängigkeit zugreifen möchte/muss, und zu welchen APIs der Code zusätzlich kompatibel sein muss, entscheidet man sich für das eine oder das andere.

Konstukror-Injection: DieAbhängigkeit wird als Parameter im Konstrukor übergeben.
Method-Injection (bzw Setter-Injection): Die Abhängigkeit wird nach Erstellen des Objekts per setter-Methode gesetzt.
Fiel-Injection: Die Abhängigkeit wird direkt gesetzt, entweder ebenfalls über setter-Methoden, oder per reflection oder mittels durch byte-code-manipuliation ermöglichtem Zugriff. Hängt von der Implementierung ab.


----------



## Joose (13. Nov 2015)

Was ist dir bei den Beschreibung aus dem Internet unklar? Wo genau liegt das Verständnisproblem?

Bei Field-, Constructor- und Method Injection ist der Große Unterschied einfach nur wie die Abhängigkeiten zu einem Objekt hinzugefügt werden.
Eben durch einen Methoden- oder Konstruktoraufruf oder eben in der Klasse direkt über einen Factoryaufruf.


----------



## johndearmusik (13. Nov 2015)

Naja, also die unterschiede sind mir eigentlich klar. Ich weiß nur nicht warum man das nützt bzw warum man sie benötigt ?


----------



## Joose (13. Nov 2015)

Du hast danach gefragt ob dir jemand den Unterschied erklären kann, nicht warum man sowas überhaupt verwendet.

Weil eine Klasse sich nicht darum kümmern sollte woher sie benötigten Objekte und Daten bekommt, sondern nur wie sie die verwendet.
Woher die Objekte und Daten kommen bestimmt wer anderes. Damit das Objekt aber eben die Daten zum Verarbeiten hat, werden diese per Injection von außen gesetzt (Konstruktorparameter, Methodenparameter).

Simples Beispiel:
Eine Klasse Calculator hat zwei Methoden "add" und "subtract". Es interessiert die Klasse nicht woher sie jetzt 2 Werte bekommt die sie addieren bzw. subtrahieren kann.
Damit aber zur Laufzeit ein Objekt der Klasse Calculator richtig arbeitet und keinen Fehler wirft muss von außen jemand 2 Werte übergeben.
Das könnte nun eine Klasse sein welche diese Wert aus einer Datei oder von der Konsole gelesen hat.


----------



## johndearmusik (13. Nov 2015)

perfekt, wunderbar. Ja ich habe mich bisschen sehr doof ausgedrückt. Vielen dank für eure Hilfe ! Danke für das Beispiel, macht mir nochmal alles bewusst. Vielen Dank!


----------

