2016-07-19 12 views
4

Ich habe nie selbst die Java-Abhängigkeitsinjektion Funktion verwendet, so ging ich einige Seiten darüber lesen und mir ist immer noch nicht klar über das Duell zwischen der Singleton und Abhängigkeitsinjektion.Singleton vs Dependency Injection

Nehmen wir ein einfaches Beispiel: Angenommen, ich baue eine kleine Java-Anwendung mit MVC- oder MVVM-Pattern. Ich würde mit einer Login-Seite beginnen und einen Benutzernamen und ein Passwort anfordern. Diese 2 Informationen können später in der Anwendung benötigt werden, so dass ich sie in einem einfachen POJO speichern müsste, das von jeder Ansicht der Anwendung zugänglich ist.

Was soll ich dann verwenden? Ein Singleton? Oder soll ich @ den Konstruktor des POJO einlesen und bei Bedarf mit dem Injector bekommen (wie bei Guice)?

Danke für die Aufklärung :)

+0

Es ist nicht entweder oder. 90% (99%?) Der Zeit, es ist beides: Singletons mit Dependency Injection. – Andreas

+0

@Andreas können Sie erarbeiten? – c0der

+0

Ich bin ein wenig verwirrt von Andreas 'Antwort auch um ehrlich zu sein: S – Xendar

Antwort

1

Ich würde bleiben weg von einem POJO bekommen injiziert mit einer Abhängigkeit. In dieser Situation würde ich meine ViewModels mit einem Singleton-Dienst versehen, der Ihren Benutzer bereitstellt/verwaltet. Wenn sie den aktuellen Benutzer benötigen, stellt ihr injizierter Dienst ihnen die aktuelle relevante POJO-Instanz zur Verfügung. Solange Ihr Benutzerverwaltungsdienst in eine Schnittstelle eingebunden ist, kann er später ersetzt werden, ohne die Funktionalität zu zerstören. Ich denke, dies erfüllt IoC.

So habe ich ähnliche Probleme angegangen, ich bin mir nicht sicher, es ist der beste Weg, es zu tun.

+0

Ich verstehe den Punkt und in der Tat durch einen dedizierten Dienst Zugriff auf die Informationen in der Art und Weise gehen sicher. Also, wenn wir einen Service haben, injizieren wir die Service-Implementierung, wo benötigt, und diese wird die Benutzerdaten von diesem POJO (oder was auch immer sonst) holen. Aber wie macht man diesen POJO "persistent" (nicht physikalisch, sondern im Anwendungsspeicher verfügbar). Eine grundlegende statische Instanz in der Service-Implementierung? Etwas sauberer? – Xendar

+0

Nicht sicher, ich verstehe die Frage genau, aber die Dienstinstanz ist ein "Singleton" in dem nur eine Instanz injiziert wird, also keine Notwendigkeit für statische. Nur eine einzige "Current User" -Instanz in der einzelnen Dienstinstanz. Da der Service shared/singleton ist, werden alle Anfragen von derselben Service-Instanz an denselben POJO übergeben. – Joe

+0

Wieder lesen was ich geschrieben habe, fühle ich mich ein bisschen dumm. Ich denke, ich brauche etwas Ruhe! Danke für den Versuch, auf die dumme Frage zu antworten, obwohl :) – Xendar

1

Einfache POJO sollte durch Dependency-Injektion nicht injiziert werden. Es sollte nicht Singleton sein, da Sie für jede Anforderung eine neue Instanz erstellen müssen.

Dependency-Injection sollte verwendet werden, um die "Verdrahtung" Ihrer Anwendungskomponenten/Dienste/Repositories/Beans/etc. Es hilft Ihnen, Ihre Anwendung Modularität, Verkapselung zwischen Ihren Komponenten zu machen. Und vieles mehr ..

Singleton ist, wenn Sie ein Objekt brauchen, um nur 1 Instanz pro Anwendung zu sein. Dies kann programmgesteuert mit der Methode static instance und getInstance (wie Singleton-Muster) oder durch Erstellen von nur einer Instanz in der Main-Klasse oder im Kontext erreicht werden. Im Frühling, wenn nicht anders konfiguriert, sind alle Beans Singleton, weil der Kontext nur 1 Instanz erzeugt.

Die Abhängigkeitsinjektion wird nützlich, wenn Sie Ihre "Singletons" miteinander verbinden müssen.

Ich hoffe, es wurde genug geklärt.