Frage

Was sind die Vor- und Nachteile der Verwendung von @Autowired in einer Klasse, die von Spring verdrahtet werden?

Nur um zu klären, ich spreche speziell über die @Autowired Anmerkung, nicht auto-Verdrahtung in XML.

ich wahrscheinlich einfach nicht verstehen, aber ich scheint es fast wie ein Anti-Muster - Ihre Klassen bewusst zu werden beginnen, dass sie an einem DI Rahmen gebunden sind, und nicht nur sein POJOs. Vielleicht bin ich ein Vielfraß für Strafe, aber Ich mag für Bohnen die externe XML-Konfigurations mit, und Ich mag explizite Verdrahtungen haben, so dass ich weiß genau, was verdrahtet ist, wo.

War es hilfreich?

Lösung

Für eine lange Zeit, die ich glaubte, dass es einen Wert hat mit einer „zentralisierten, deklarative, Konfiguration“, wie die XML-Dateien alle verwendeten wir zu verwenden. Dann erkannte ich, dass die meisten Dinge in den Akten war nicht Konfiguration - es wurde nie irgendwo nach der Entwicklung verändert, je. Dann wurde mir klar, dass „zentralisiert“ nur Wert in ganz kleinen Systemen hat - nur in kleinen Systemen werden Sie immer in der Lage sein, eine Konfigurationsdatei als Ganzes grok . Und was ist wirklich der Wert der Verdrahtung als Ganzes zu verstehen, wenn die gleichen „Verdrahtungen“ werden meist von Abhängigkeiten im Code dupliziert? So ist die einzige Sache, die ich gehalten habe, ist Meta-Daten (Anmerkungen), die noch Art-deklarative ist. Diese nie Änderung zur Laufzeit und sie sind nie „Konfiguration“ Daten, dass jemand im laufenden Betrieb ändern wird -. Ich denke also, halten es in dem Code ist schön

Ich verwende volle Auto-Verkabelung so viel wie ich kann. Ich liebe es. Ich will nicht zurück zu altem Stil Feder, es sei denn am Gewehrpunkt bedroht. Meine Gründe für die Bevorzugung voll @Autowired haben sich im Laufe der Zeit verändert.

Im Moment denke ich, der wichtigste Grund für autowiring ist, dass man sich weniger Abstraktion in Ihrem System, um zu verfolgen. Die „Bean Namen“ effektiv verschwunden. Es stellt sich heraus nur die Bohne Namen wegen xml existiert. So eine volle Schicht von abstrakter Indirekt (wo man würde bohnen Namen „foo“ in bean „bar“ Draht) ist verschwunden. Jetzt verdrahten ich die „Foo“ Schnittstelle in meine Bohne direkt und Umsetzung wird durch Laufzeitprofil ausgewählt. Dies ermöglicht es mir zu Arbeit mit Code , wenn Abhängigkeiten und Implementierungen zu verfolgen. Wenn ich eine autowired Abhängigkeit in meinem Code sehen kann ich drücken Sie einfach den „go to implementation“ Schlüssel in der IDE und aufgeht die Liste der bekannten Implementierungen. In den meisten Fällen ist es nur eine Implementierung und ich bin gerade in die Klasse. Kann nicht viel einfacher als das sein, und ich weiß immer genau , welche Implementierung verwendet wird (ich behaupte, dass das Gegenteil mit XML-Verdrahtung näher an die Wahrheit ist - komisch, wie Ihre Perspektive ändert)

Nun könnte man sagen, dass es nur eine sehr einfache Schicht, aber jede Ebene der Abstraktion, die wir unsere Systeme hinzufügen erhöhen Komplexität. Ich glaube wirklich nicht, die xml jemals einen wirklichen Wert zu jedem System hinzugefügt ich gearbeitet habe.

Die meisten Systeme, die ich je mit nur habe arbeiten müssen ein Konfiguration der Produktionslaufzeitumgebung. Es können auch andere Konfigurationen für Test und so weiter.

Ich würde sagen, dass die vollen autowiring die ist ruby-on-rails des Frühlings: Es umfasst die Vorstellung, dass es ein normales und gemeinsame Nutzung Muster ist, dass die meisten Anwendungsfälle folgen. Mit XML-Konfiguration Sie erlaubt eine Menge konsistent / inkonsistent Konfiguration Verwendung, die nicht dazu gedacht sein kann / können. Ich habe so viel XML-Konfiguration mit Unstimmigkeiten über Bord gehen gesehen - geht das zusammen mit dem Code Refactoring erhalten? Dachte nicht. Sind diese Variationen es für einen Grund? In der Regel nicht.

Wir verwenden kaum Qualifikation in unserer Konfiguration und fanden andere Wege, um diese Situationen zu lösen. Dies ist ein klarer „Nachteil“ wir begegnen: Wir haben etwas die Art und Weise verändern wir es mit autowiring glattem Code zu interagieren: Ein Kunden Repository nicht mehr implementiert die generische Schnittstelle Repository<Customer> aber wir machen eine Schnittstelle CustomerRepository die Repository<Customer> erstreckt. Manchmal gibt es auch einen oder anderen Trick, wenn es um Subklassifizieren kommt. Aber es in der Regel nur weist uns in Richtung einer stärkeren Typisierung, die ich finde, ist fast immer eine bessere Lösung.

Aber ja, Sie binden an einen bestimmten Stil von DI, die meist Frühjahr der Fall ist. Wir wissen nicht einmal öffentliche Setter für Abhängigkeiten machen mehr (so könnte man argumentieren, dass wir +1 in der Verkapselung / Information Hiding Abteilung sind) Wir haben noch einige XML in unserem System haben, aber die xml im Grunde nur enthält die Anomalien. Voll autowiring fügt sich perfekt mit xml.

Das einzige, was we muß nun für die @Component ist, @Autowired und der Rest in einem JSR (wie

Andere Tipps

hier Für mich ist das, was Ich mag / Abneigung über Frühling und Auto-Verkabelung.

Vorteile:

  • Auto-Verdrahtung wird von fieser XML-Konfiguration entfernen.
  • Viele einfachen Anmerkungen zu verwenden, die Sie direkt über Felder, Setter-Methoden, oder Konstrukteure injizieren können. Auch können Sie mit Anmerkungen versehen und ‚qualifizieren‘ Ihre injiziert Bohnen.

Nachteile:

  • Verwenden von Auto-Verkabelung und Anmerkungen macht Sie zur Spring Bibliothek abhängig, wo wie mit XML-Konfiguration, die Sie mit oder ohne Frühling laufen wählte könnten. Wie Sie schon sagten, werden Sie an einen DI Rahmen gebunden.
  • Zur gleichen Zeit, die ich in der Lage zu ‚qualifizieren‘ Bohnen mag, mich dies der Code wirklich chaotisch macht. Wenn Sie die gleiche Bean an mehreren Stellen injizieren müssen, habe ich die gleiche Zeichenfolge Name schon überall gesehen wiederholt. Für mich scheint das Potenzial für Fehler zu haben.

Ich habe mit Auto-Verkabelung fast ausschließlich bei der Arbeit begonnen, weil wir so viel in der Spring Integration abhängen ohnehin, dass das Abhängigkeitsproblem strittig ist. Ich arbeitete an einem Spring MVC-Projekt, die Auto-Verkabelung ausgiebig genutzt und war ein wenig schwer, meinen Kopf umwickeln.

Ich denke, Auto-Verkabelung ist ein erworbener Geschmack, sobald man sich daran gewöhnt Sie erkennen, wie mächtig, einfach und viel weniger von Kopfschmerzen ist es mit als der XML-Konfiguration zu arbeiten.

Jetzt schalten wir von @Autowire zurück zur XML-Konfiguration in unserem großen Projekt. Das Problem ist sehr gering Bootstrap-Leistung. Autowiring Scanner lädt alle Klassen von autowiring Suche Classpath werden Initialisierung eifrig im Frühjahr so, viele Klassen geladen.

Es hat sehr wenig Diskussion über Umgebungen wechseln. Die meisten Projekte, die ich daran gearbeitet habe, war ein echtes Problem Abhängigkeiten zu injizieren, abhängig von der Umgebung arbeiten wir an. Mit XML-Config ist es ziemlich einfach, mit Frühling EL, und ich bin nicht bekannt, dass schöne Lösung mit Anmerkungen. Ich habe nur ein herausgefunden:

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

Es ist zu arbeiten, aber keine schöne Lösung imho.

Ich habe @Autowire geschaltet. Die Aufrechterhaltung der XML-Konfiguration auf etwas anderes als ein kleines Projekt wurde eine Aufgabe in seinem eigenen Recht und Verständnis schnell abgebaut.

IntelliJ bietet gut (nicht perfekt) Unterstützung für den Frühling Anmerkungen.

Meine Meinung zu diesem Thema ist, dass XML-Konfiguration der Klarheit des Codes, vor allem in großen Systemen zu reduzieren.

Anmerkungen wie @Component Dinge noch schlimmer macht. Er steuert Entwickler Objekte änderbare zu machen, da Abhängigkeiten nicht endgültig nicht mehr gegeben gemacht werden, dass Standardkonstruktoren zur Verfügung gestellt werden müssen. Abhängigkeiten müssen durch öffentliche Setter entweder injiziert werden, oder unkontrolliert durch @Autowired. [Noch schlimmer Dependency Injection mit Klassen beeinträchtigt, die ihre Abhängigkeiten instanziiert, ich in geschriebenen Code sehen diese noch neu!]. Durch unkontrollierte ich meine, in großen Systemen, wenn mehrere Implementierungen (oder Kinder) des Typs vorhanden sind, wird es viel mehr beteiligt, welche der Implementierungen wurde @Autowired, eine Komplexität, die macht die Untersuchung Bugs viel schwerer zu verstehen. Es bedeutet auch, dass angeblich ein Profil für Testumgebung und eine andere für die Produktion, werden Ihre Produktion Fehler nur passieren, wenn es am meisten schmerzt - in der Produktion, anstatt in der Lage zu sein, die Fehler in der Testumgebung, oder noch besser zu erkennen, bei kompilieren Zeit!

Ich halte mich an den Mittelweg, wo ich meine Konfigurationsklasse deklarieren (n), (Java-basierte Spring-Konfiguration mit @Configuration)

Ich erkläre meine Bohnen explizit in der Konfigurationsklasse (n). Ich habe nur @Autowired in der Konfigurationsklasse verwenden (n), der Zweck ist, die Abhängigkeit von Frühling in die Konfigurationsklasse zu begrenzen (n)

Die @Configuration in einem bestimmten Paket befindet, das ist der einzige Ort, an dem der Feder-Scan ausgeführt wird. (Das beschleunigt die Startzeit im wesentlichen in großen Projekten)

ich bemühen uns, alle meine Klassen unveränderlich zu machen, vor allem das Datenobjekt, JPA, Hibernate und Spring, sowie viele Serialisierung Bibliotheken scheinen dies zu untergraben. Ich steuere weg von allem, was mir zwingt Setter zu schaffen, oder das letzte Schlüsselwort aus meiner Eigenschaft Erklärung entfernen.

Die Verringerung der Möglichkeiten der wechselnden Objekte, nachdem sie erstellt sind, erheblich reduziert die Fehler in großen System sowie reduziert die Zeit, um einen Fehler zu finden, wenn ein solches vorhanden ist.

Es scheint auch, dass es Entwickler zwingt die Wechselwirkung zwischen den verschiedenen Teilen des Systems besser zu gestalten. Probleme und Fehler werden immer mehr Kompilierungsfehlern, dass die Zeit verschwendet reduziert und die Produktivität zu steigern.

Hier sind einige Erfahrung
Pros

  • Erleichtert zu konfigurieren, da können wir nur @Autowire Annotation verwenden
  • Sie möchten nicht Setter-Methoden verwenden, so wird Klasse sauberer

Cons

  • Dicht Paar zu XML-Datei, obwohl wir DI verwenden
  • Hard Implementierung zu finden (Aber wenn Sie Ihre guten Iden mit wie IntelliJ sicher können Sie loswerden diese erhalten)

Wie von meinen persönlichen Erfahrungen habe ich nicht @AutoWire Anmerkung: zu viel, aber in Testfällen verwenden.

Ich liebe Schreib wirklich mit Anmerkungen anstelle von XML. Nach dem Frühjahr Handbuch und der letzten Versionen, XML und Annotation erreichte das gleiche Ergebnis.

Dies ist meine Liste

Pro:

  • Entfernen nutzlos Linie von xml
  • Vereinfachen Sie die Debugging-Code ab: wenn Sie eine Klasse öffnen, können Sie lesen, was Sie in der Klasse
  • Mehr schnell developping, ein Projekt mit 400 oder mehr Linie von XML lesbar ist?

Nachteile:

  • Ist das nicht Standard-Java-Implementierung, aber Sie können wechseln @Inject zu verwenden, die ein Java Standard Api ist, so dass die Bohne bleibt ein Pojo
  • Sie können einfach nicht überall verwenden, DB-Verbindung e so weiter, aber es ist nur eine Meinung, ziehe ich einen Platz haben, wo alle Konfigurations lesen.

Für mein Verständnis @Autowired ist die beste zu verwenden, während verweisen Bezug auf Oberfläche und ihre Überschreibung funtions verwenden, aber ich nur Problem findet dabei ist, dass es manchmal zu null zur Laufzeit zugewiesen.

scroll top