Spring @Autowired-Nutzung

Lesezeit: 10 Minuten

Benutzer-Avatar
Andi Weiß

Was sind die Vor- und Nachteile der Verwendung @Autowired in einer Klasse, die bis Spring verdrahtet sein wird?

Nur zur Verdeutlichung, ich spreche speziell über die @Autowired Anmerkung, keine automatische Verdrahtung in XML.

Ich verstehe es wahrscheinlich einfach nicht, aber für mich scheint es fast wie ein Anti-Muster – Ihre Klassen beginnen sich bewusst zu werden, dass sie an ein DI-Framework gebunden sind und nicht nur POJOs sind. Vielleicht bin ich ein Straffresser, aber ich mag es, die externe XML-Konfiguration für Beans zu haben, und ich mag explizite Verbindungen, damit ich genau weiß, was wo verbunden ist.

  • Ich interessiere mich auch für dieses Thema – das Konfigurieren Ihrer MVC-App über Anmerkungen anstelle von XML scheint zu einer umfangreichen Suche nach “Welche Klasse ist dieser URL zugeordnet?” zu führen. “wer kümmert sich darum?”. Ich mag es, eine einzige Konfigurationsquelle zu haben

    – matt b

    11. März 2009 um 2:56 Uhr

  • der Begriff “@Autowiring” scheint hier irreführend zu sein. Da Sie auch mit der XML-Konfiguration eine automatische Verdrahtung durchführen können, sollte die ursprüngliche Frage in “Vor- und Nachteile der Verwendung von Spring-Anmerkungen” umformuliert werden. Die bereitgestellte Antwort konzentriert sich mehr auf die Aspekte der automatischen Verdrahtung und weniger auf Aspekte der Verwendung von Anmerkungen.

    – Neem Praks

    11. März 2009 um 7:00 Uhr

  • Mögliches Duplikat von Understanding Spring @Autowired use

    – tkruse

    6. Dezember 2017 um 5:11 Uhr

Benutzer-Avatar
krosenvold

Lange habe ich geglaubt, dass eine „zentralisierte, deklarative Konfiguration“ wie die XML-Dateien, die wir alle verwendet haben, einen Wert hat. Dann wurde mir klar, dass das meiste in den Dateien nicht so war Aufbau – Es wurde nach der Entwicklung nirgendwo geändert, niemals. Dann wurde mir klar, dass “zentralisiert” nur in recht kleinen Systemen einen Wert hat – nur in kleinen Systemen können Sie jemals eine Konfigurationsdatei groken als Ganzes. Und welchen Wert hat es wirklich, die Verkabelung als Ganzes zu verstehen, wenn die gleichen “Verkabelungen” meistens durch Abhängigkeiten im Code dupliziert werden? Das einzige, was ich behalten habe, sind Metadaten (Anmerkungen), die immer noch deklarativ sind. Diese noch nie zur Laufzeit ändern und sie sind noch nie “Konfigurationsdaten”, die jemand im laufenden Betrieb ändern wird – daher denke ich, dass es schön ist, sie im Code zu behalten.

Ich verwende so viel wie möglich die automatische Verkabelung. Ich liebe es. Ich werde nicht zum alten Frühling zurückkehren, wenn ich nicht mit vorgehaltener Waffe bedroht werde. Meine Gründe für die Bevorzugung vollständig @Autowired haben sich im Laufe der Zeit verändert.

Im Moment denke ich, dass der wichtigste Grund für die Verwendung von Autowiring darin besteht, dass es eine Abstraktion weniger in Ihrem System gibt, die Sie im Auge behalten müssen. Der “Bohnenname” ist praktisch weg. Es stellt sich heraus, dass der Bean-Name nur wegen XML existiert. Eine ganze Ebene abstrakter Indirektionen (wo Sie den Bean-Namen „foo“ mit Bean „bar“ verbinden würden) ist also weg. Jetzt verbinde ich die “Foo”-Schnittstelle direkt mit meiner Bean, und die Implementierung wird vom Laufzeitprofil ausgewählt. Das erlaubt mir mit Code arbeiten beim Verfolgen von Abhängigkeiten und Implementierungen. Wenn ich in meinem Code eine automatisch verdrahtete Abhängigkeit sehe, kann ich in meiner IDE einfach die Taste „Gehe zur Implementierung“ drücken, und es erscheint die Liste der bekannten Implementierungen. In den meisten Fällen gibt es nur eine Implementierung und ich bin direkt in der Klasse. Viel einfacher kann es nicht sein, und ich weiß es immer exakt welche Implementierung verwendet wird (ich behaupte, dass das Gegenteil bei der XML-Verkabelung der Wahrheit näher kommt – lustig, wie sich Ihre Perspektive ändert!)

Nun könnte man sagen, dass es nur eine sehr einfache Schicht ist, aber jede Abstraktionsschicht, die wir unseren Systemen hinzufügen Zunahme Komplexität. Ich glaube wirklich nicht, dass XML jemals einen wirklichen Mehrwert für irgendein System gebracht hat, mit dem ich gearbeitet habe.

Die meisten Systeme, mit denen ich je gearbeitet habe, haben nur eines Konfiguration der Produktionslaufzeitumgebung. Möglicherweise gibt es andere Konfigurationen zum Testen usw.

Ich würde sagen, dass die vollständige automatische Verdrahtung der Rubin des Frühlings ist: Sie umfasst die Vorstellung, dass es ein normales und allgemeines Nutzungsmuster gibt, dem die meisten Anwendungsfälle folgen. Mit XML-Konfiguration Sie erlauben eine Menge konsistenter/inkonsistenter Konfigurationsnutzung, die möglicherweise beabsichtigt ist oder nicht. Ich habe gesehen, dass so viele XML-Konfigurationen mit Inkonsistenzen über Bord gegangen sind – wird sie zusammen mit dem Code umgestaltet? Dachte nicht. Gibt es diese Variationen aus einem bestimmten Grund? Normalerweise nicht.

Wir verwenden in unserer Konfiguration kaum Qualifizierer und haben andere Wege gefunden, um diese Situationen zu lösen. Dies ist ein klarer “Nachteil”, auf den wir stoßen: Wir haben die Art und Weise, wie wir codieren, leicht geändert, damit sie reibungsloser mit Autowiring interagiert: Ein Kunden-Repository implementiert das Generikum nicht mehr Repository<Customer> Schnittstelle, aber wir machen eine Schnittstelle CustomerRepository das erstreckt sich Repository<Customer>. Manchmal gibt es auch ein oder zwei Tricks, wenn es um Unterklassen geht. Aber es weist uns normalerweise nur in die Richtung einer stärkeren Eingabe, was meiner Meinung nach fast immer eine bessere Lösung ist.

Aber ja, Sie binden sich an einen bestimmten DI-Stil, der meistens im Frühling auftritt. Wir machen nicht einmal mehr öffentliche Setter für Abhängigkeiten (Sie könnten also argumentieren, dass wir +1 in der Abteilung für Kapselung/Verbergen von Informationen sind). Wir haben immer noch etwas XML in unserem System, aber im Grunde genommen das XML nur enthält die Anomalien. Vollständige automatische Verdrahtung lässt sich gut in XML integrieren.

Das einzige, was wir jetzt brauchen, ist für die @Component, @Autowired und der Rest in einer JSR enthalten sein (wie JSR-250), also müssen wir nicht an den Frühling anknüpfen. So sind die Dinge in der Vergangenheit passiert (die java.util.concurrent Dinge, die mir in den Sinn kommen), also wäre ich nicht völlig überrascht, wenn dies noch einmal passieren würde.

  • javax.annotation/javax.inject wird von Spring unterstützt, sodass Sie keine Codeabhängigkeit von Spring haben müssen.

    – Michael Willes

    16. Juni 2012 um 17:08 Uhr

Für mich ist hier, was ich an Spring und automatischer Verkabelung mag / nicht mag.

Vorteile:

  • Auto-Wiring beseitigt die unangenehme XML-Konfiguration.
  • Viel einfacher zu verwendende Anmerkungen, mit denen Sie direkt mit Feldern, Setter-Methoden oder Konstruktoren einfügen können. Ermöglicht es Ihnen auch, Ihre injizierten Bohnen zu kommentieren und zu “qualifizieren”.

Nachteile:

  • Die Verwendung von Auto-Wiring und Anmerkungen macht Sie von Spring-Bibliotheken abhängig, bei denen Sie wie bei der XML-Konfiguration wählen können, ob Sie mit oder ohne Spring laufen möchten. Wie Sie sagten, werden Sie an ein DI-Framework gebunden.
  • Gleichzeitig mag ich es, Beans ‘qualifizieren’ zu können, für mich macht das den Code wirklich chaotisch. Wenn Sie dieselbe Bohne an mehreren Stellen injizieren müssen, habe ich gesehen, dass derselbe Zeichenfolgenname überall wiederholt wurde. Das scheint mir Fehlerpotential zu haben.

Ich habe angefangen, die automatische Verkabelung fast ausschließlich bei der Arbeit zu verwenden, weil wir ohnehin so sehr von der Spring-Integration abhängig sind, dass das Abhängigkeitsproblem strittig ist. Ich habe an einem Spring MVC-Projekt gearbeitet, das ausgiebig Auto-Wiring verwendet hat und etwas schwer zu verstehen war.

Ich denke, die automatische Verkabelung ist ein erworbener Geschmack, sobald Sie sich daran gewöhnt haben, erkennen Sie, wie leistungsfähig, einfach und viel weniger Kopfschmerzen es ist, damit zu arbeiten als mit der XML-Konfiguration.

  • xml-Konfiguration wird viel weniger unangenehm, wenn Sie die kostenlose Springsource Tool Suite verwenden, die automatische Vervollständigung, Bohnendiagramme usw

    – Sean Patrick Floyd

    18. Mai 2010 um 12:08 Uhr

  • Ich stimme Ihnen vollkommen zu, dass die automatische Verkabelung chaotisch und abhängig von den Federbibliotheken wird! Ich habe die XML-Konfiguration noch nie verwendet und denke, ich sollte vielleicht diesen Weg einschlagen?

    – James111

    20. Juli 2016 um 0:01 Uhr

Wir stellen in unserem großen Projekt von @Autowire wieder auf XML-Konfiguration um. Das Problem ist eine sehr geringe Bootstrap-Performance. Der Autowiring-Scanner lädt alle Klassen aus dem Autowiring-Suchklassenpfad, sodass viele Klassen während der Spring-Initialisierung eifrig geladen werden.

  • Ich habe festgestellt, dass Javaconfig sogar eine bessere Lösung zum Starten von Teilkontexten ist, was ein großer Gewinn ist. Sie können diese jedoch ganz einfach kombinieren, indem Sie @Autowired/@Inject für Konstruktoren verwenden (mit anderen Worten, wechseln Sie zur Konstruktorinjektion).

    – krosenvold

    9. September 2013 um 11:21 Uhr


Benutzer-Avatar
BTakacs

Es wurde sehr wenig über das Wechseln von Umgebungen diskutiert. Bei den meisten Projekten, an denen ich gearbeitet habe, war es ein echtes Problem, abhängig von der Umgebung, in der wir arbeiten, Abhängigkeiten einzufügen. Mit XML-Konfiguration ist es mit Spring EL ziemlich einfach, und mir ist keine nette Lösung mit Anmerkungen bekannt. Mir ist gerade eins eingefallen:

    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;

Es sollte funktionieren, aber imho keine schöne Lösung.

Ich bin zu @Autowire gewechselt. Die Pflege der XML-Konfiguration bei etwas anderem als einem kleinen Projekt wurde zu einer eigenständigen Aufgabe, und das Verständnis verschlechterte sich schnell.

IntelliJ bietet gute (nicht perfekte) Unterstützung für Spring-Anmerkungen.

Meine Meinung zu diesem Thema ist, dass die XML-Konfiguration die Klarheit des Codes verringert, insbesondere in großen Systemen.

Anmerkungen wie @Component machen die Sache noch schlimmer. Es lenkt Entwickler dazu, Objekte änderbar zu machen, da Abhängigkeiten nicht mehr endgültig gemacht werden können, da Standardkonstruktoren bereitgestellt werden müssen. Abhängigkeiten müssen entweder über einen öffentlichen Setter oder unkontrolliert über @Autowired injiziert werden. [even worse dependency injection is compromised with classes that instantiate their dependencies, I still see this in newly written code!]. Mit unkontrolliert meine ich, dass es in großen Systemen, wenn mehrere Implementierungen (oder Kinder) des Typs verfügbar sind, viel komplizierter wird, zu verstehen, welche der Implementierungen @Autowired war, eine Komplexität, die die Untersuchung von Fehlern viel schwieriger macht. Es bedeutet auch, dass, wenn Sie angeblich ein Profil für die Testumgebung und ein anderes für die Produktion haben, Ihre Produktionsfehler nur dann auftreten, wenn es am meisten wehtut – in der Produktion, anstatt die Fehler in der Testumgebung oder noch besser in erkennen zu können Kompilierzeit!

Ich bleibe beim Mittelweg, wo ich meine Konfigurationsklasse(n) deklariere (Java-basierte Spring-Konfiguration mit @Configuration).

Ich deklariere alle meine Beans explizit in den Konfigurationsklassen. Ich verwende @Autowired nur in den Konfigurationsklassen, der Zweck besteht darin, die Abhängigkeit von Spring auf die Konfigurationsklasse(n) zu beschränken.

Die @Configuration befindet sich in einem bestimmten Paket, das ist der einzige Ort, an dem der Frühlingsscan ausgeführt wird. (Das beschleunigt die Startzeit in großen Projekten erheblich)

Ich bemühe mich, alle meine Klassen unveränderlich zu machen, insbesondere das Datenobjekt, JPA, Hibernate und Spring, sowie viele Serialisierungsbibliotheken scheinen dies zu untergraben. Ich halte mich von allem fern, was mich dazu zwingt, Setter bereitzustellen oder das Schlüsselwort final aus meiner Eigenschaftserklärung zu entfernen.

Das Reduzieren der Möglichkeiten zum Ändern von Objekten, nachdem sie erstellt wurden, reduziert die Fehler in großen Systemen erheblich und verkürzt die Zeit, um einen Fehler zu finden, wenn einer vorhanden ist.

Es scheint auch, dass es den Entwickler dazu zwingt, die Interaktion zwischen den verschiedenen Teilen des Systems besser zu gestalten. Probleme und Fehler werden immer mehr zu Kompilierungsfehlern, was Zeitverschwendung reduziert und die Produktivität verbessert.

Benutzer-Avatar
Rajith Delantha

Hier einige Erfahrungswerte
Vorteile

  • Erleichtert die Konfiguration, da wir einfach die Annotation @Autowire verwenden können
  • Ich möchte keine Setter-Methoden verwenden, damit die Klasse sauberer ist

Nachteile

  • Eng an die XML-Datei gekoppelt, obwohl wir DI verwenden
  • Schwer zu findende Implementierung (Aber wenn Sie gute Ideen wie intellij verwenden, können Sie diese sicher loswerden)

Nach meinen persönlichen Erfahrungen habe ich die @AutoWire-Annotation nicht so oft verwendet, sondern in Testfällen.

1355610cookie-checkSpring @Autowired-Nutzung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy