Wann sollte man Spring nicht verwenden, um eine Bohne zu instanziieren?

13

Ich versuche zu verstehen, was der richtige Gebrauch von Spring wäre. Nicht syntaktisch, sondern zweckmäßig. Wenn Sie Spring verwenden, sollte der Spring-Code dann den gesamten Bean-Instanziierungscode ersetzen? Wann sollte man Spring verwenden oder wann nicht, um eine Bohne zu instantiieren?

Das folgende Codebeispiel kann Ihnen dabei helfen, mein Dilemma zu verstehen:

List<ClassA> caList = new ArrayList<ClassA>();
for (String name : nameList) {
    ClassA ca = new ClassA();
    ca.setName(name);
    caList.add(ca);
}

Wenn ich Spring konfiguriere, sieht es so aus:

List<ClassA> caList = new ArrayList<ClassA>();
for (String name : nameList) {
    ClassA ca = (ClassA)SomeContext.getBean(BeanLookupConstants.CLASS_A);
    ca.setName(name);
    caList.add(ca);
}

Ich persönlich denke, dass die Verwendung von Spring hier einen unnötigen Aufwand bedeutet, weil

  1. Der Code ist einfacher zu lesen / verstehen.
  2. Es ist nicht wirklich ein guter Ort für die Abhängigkeitsinjektion, da ich nicht erwarte, dass es eine mehrfache / abwechslungsreiche Implementierung von gibt ClassA, die ich zu einem späteren Zeitpunkt durch die Verwendung der Federkonfiguration ersetzen möchte.

Denke ich richtig Wenn nicht, wohin gehe ich falsch?

Rishabh
quelle

Antworten:

14

Sie haben recht, Spring ist für den von Ihnen angegebenen Anwendungsfall ungeeignet. Spring eignet sich besser zum Verwalten externer Abhängigkeiten (z. B. zum Anschließen einer JDBC-Verbindung an ein DAO) oder für Konfigurationen (z. B. zum Festlegen des zu verwendenden Datenbanktyps). In Ihrem Beispiel würden Sie, wenn sich der Bean-Typ ändern könnte, eine Schnittstelle verwenden, um das Bean anzugeben, und die Beans mithilfe einer Factory instanziieren. Mit Spring können Sie angeben, welche Factory verwendet werden soll, und diese in die Klasse einfügen, die zum Instanziieren der Beans erforderlich ist. Sie könnten dann mehrere verschiedene Fabriken haben, die verschiedene Arten von Beans erstellt haben (die alle die Bean-Schnittstelle unterstützten), und diese zum Zeitpunkt der Installation (oder Aktualisierung) konfigurieren.

TMN
quelle
9

Ich würde Spring (oder ein anderes DI-System) zwischen Layern verwenden, um die Instanziierung innerhalb von Layern zu steuern.
Eine Klasse, die eine Bean erstellt, die den Bereich dieser Klasse einem (funktional) externen System überlässt, das möglicherweise von diesem System oder einer Kommunikationsschicht definiert wird, würde über DI erstellt. Eine weitere Bean, die nur für den internen Gebrauch innerhalb der Anwendungsebene erstellt wurde, wird direkt erstellt, und zwar aus Gründen der Code-Klarheit und (in großen Systemen ebenso wichtig) der Leistung.

jwenting
quelle
Dies ist auch eine gültige Antwort für mich! Leider kann ich nur eine Antwort wählen.
Rishabh
1

Wenn es sich um eine Bean handelt , sollten Sie Spring die Erstellung überlassen (außer Sie können eine Factory-Bean bereitstellen - ich habe diese verwendet, um eine bestimmte Unterklasse in Abhängigkeit von einer Systemeigenschaft zurückzugeben - und Sie sollten die Dokumentation zu @Configurationund die @BeanAnmerkungen zu Rate ziehen wenn du das tust). Wenn es sich nicht um eine Bean, sondern nur um ein einfaches altes Java-Objekt handelt, müssen Sie Spring nicht verwenden, um es überhaupt zu erstellen. POJOs sind nützlich, erhalten jedoch keine Abhängigkeitsinjektion, AOP-Wrapper usw., da dies die Dinge sind, die Spring für Sie hinzufügt.

Die grundlegende Entscheidung ist, ob es sich wirklich um eine Bean oder nur um ein gewöhnliches Objekt handelt, das zufällig einige Bean-Konventionen befolgt (z. B. die Benennung von Methoden). Ich kann mir nicht vorstellen, was aus dem kleinen Beispiel, das Sie gaben, wirklich der Fall ist.

Donal Fellows
quelle
Hallo Donal, wäre Ihre Antwort dieselbe, wenn ClassA eine Domain-Klasse ist, die reich an Geschäftslogik ist?
Sameer Patil
0

Ich könnte falsche Experten sein, bitte korrigieren.

Das gesamte Konzept von Bean in spring besteht darin, dass Spring Container sich um Objekte kümmert. Es ist die Geburt, der Umfang, der Lebenszyklus, der Tod usw. Es ist, als wäre es ein Hausmeister des Objekts. Die Anwendung, die es benötigt, injiziert es.

Überlegen Sie sich daher beim Entscheiden während des Entwurfs Ihres Moduls immer, ob Sie das Spring-Framework berücksichtigen möchten oder ob es sich um ein einfaches Objekt handelt, dessen Lebenszyklus in einer Methode eingeschlossen ist.

Wie bereits erwähnt, sind Dao-Objekte, JMS-Queues, Objekte usw. sehr umfangreich und sollten dem Experten überlassen werden, der das Spring-Framework erstellt, um sich darum zu kümmern.

Rahul Joshi
quelle