XML-Konfiguration versus Annotation-basierte Konfiguration [geschlossen]

131

In einigen großen Projekten, an denen ich in letzter Zeit gearbeitet habe, scheint es immer wichtiger zu werden, das eine oder andere (XML oder Annotation) zu wählen. Wenn Projekte wachsen, ist Konsistenz für die Wartbarkeit sehr wichtig.

Meine Fragen sind: Was sind die Vorteile der XML-basierten Konfiguration gegenüber der Annotation-basierten Konfiguration und was sind die Vorteile der Annotation-basierten Konfiguration gegenüber der XML-basierten Konfiguration?

Abarax
quelle
Angenommen, Sie meinen Anmerkungen wie @Componentund @Autowired, dann ist dies eine falsche Zweiteilung. Es gibt andere Möglichkeiten, Ihre Konfiguration zu erstellen, einschließlich JavaConfig und groovy config.
Bacar
Bitte überprüfen Sie auch diese stackoverflow.com/questions/8428439/…
pramodc84

Antworten:

199

Anmerkungen haben ihre Verwendung, aber sie sind nicht die einzige Silberkugel, die die XML-Konfiguration beendet. Ich empfehle die beiden zu mischen!

Wenn Sie beispielsweise Spring verwenden, ist es völlig intuitiv, XML für den Teil der Abhängigkeitsinjektion Ihrer Anwendung zu verwenden. Dadurch werden die Abhängigkeiten des Codes von dem Code entfernt, der ihn verwendet. Im Gegensatz dazu macht eine Verwendung einer Anmerkung im Code, der die Abhängigkeiten benötigt, den Code auf diese automatische Konfiguration aufmerksam.

Anstatt XML für die Transaktionsverwaltung zu verwenden, ist es jedoch durchaus sinnvoll, eine Methode als transaktional mit einer Anmerkung zu markieren, da dies Informationen sind, die ein Programmierer wahrscheinlich wissen möchte. Dass eine Schnittstelle als SubtypeY anstelle eines SubtypeX eingefügt wird, sollte jedoch nicht in die Klasse aufgenommen werden. Wenn Sie jetzt SubtypeX einfügen möchten, müssen Sie Ihren Code ändern, während Sie zuvor einen Schnittstellenvertrag hatten Mit XML müssten Sie nur die XML-Zuordnungen ändern, und dies ist ziemlich schnell und problemlos.

Ich habe keine JPA-Annotationen verwendet, daher weiß ich nicht, wie gut sie sind, aber ich würde argumentieren, dass es auch gut ist, die Zuordnung von Beans zur Datenbank in XML zu belassen, da es dem Objekt egal sein sollte, woher seine Informationen stammen Es sollte sich nur darum kümmern, was es mit seinen Informationen anfangen kann. Aber wenn Sie JPA mögen (ich habe keine Erfahrung damit), machen Sie es auf jeden Fall.

Im Allgemeinen: Wenn eine Annotation Funktionen bietet und an und für sich als Kommentar fungiert und den Code nicht an einen bestimmten Prozess gebunden ist, um ohne diese Annotation normal zu funktionieren, wählen Sie Annotationen. Beispielsweise tötet eine als transaktional gekennzeichnete Transaktionsmethode ihre Betriebslogik nicht und dient auch als guter Kommentar auf Codeebene. Andernfalls werden diese Informationen wahrscheinlich am besten als XML ausgedrückt, da sie zwar letztendlich die Funktionsweise des Codes beeinflussen, jedoch die Hauptfunktionalität des Codes nicht ändern und daher nicht in die Quelldateien gehören.

MetroidFan2002
quelle
Danke für die tolle Antwort! Ich hatte einige Schwierigkeiten bei der Entscheidung, welche ich verwenden soll. Diese SO-Antwort besagt, dass sie die Entkopplung fördern, während dieser Blog-Beitrag sagt, dass sie die enge Kopplung fördern! Ihre Antwort hat das Problem für mich wirklich geklärt.
Mikayla Maki
5
Ich würde diesen Rat wie folgt zusammenfassen: Verwenden Sie Anmerkungen für AOP (Transaktionen können beispielsweise als Aspekt behandelt werden), aber verwenden Sie sie nicht für die Abhängigkeitsinjektion.
Bacar
1
Ist diese Antwort heutzutage (2015) noch aktuell?
sp00m
1
In den meisten Fällen scheint für die meisten Menschen eine Annotation bevorzugt zu sein
Junchen Liu
31

Hier gibt es ein größeres Problem, nämlich externe und inline Metadaten. Wenn Ihr Objektmodell immer nur auf eine Weise bestehen bleibt, sind inline Metadaten (dh Anmerkungen) kompakter und lesbarer.

Wenn Ihr Objektmodell jedoch in verschiedenen Anwendungen so wiederverwendet wurde, dass jede Anwendung das Modell auf unterschiedliche Weise beibehalten wollte, ist die Externalisierung der Metadaten (dh XML-Deskriptoren) angemessener.

Keiner ist besser, und daher werden beide unterstützt, obwohl Anmerkungen modischer sind. Infolgedessen legen neue Hair-on-Fire-Frameworks wie JPA tendenziell mehr Wert auf sie. Ausgereiftere APIs wie native Hibernate bieten beides, da bekannt ist, dass keines davon ausreicht.

Skaffman
quelle
13

Ich denke immer an Anmerkungen als eine Art Indikator dafür, wozu eine Klasse fähig ist oder wie sie mit anderen interagiert.

Die Spring XML-Konfiguration ist für mich genau das, die Konfiguration

Beispielsweise werden Informationen über die IP-Adresse und den Port eines Proxys definitiv in eine XML-Datei übertragen. Dies ist die Laufzeitkonfiguration.

Verwenden Sie @Autowire, @Elementum das Framework anzugeben, was mit der Klasse zu tun ist, und verwenden Sie Anmerkungen.

Das Einfügen der URL in die @WebserviceAnmerkung ist ein schlechter Stil.

Das ist aber nur meine Meinung. Die Grenze zwischen Interaktion und Konfiguration ist nicht immer klar.

Huibert Gill
quelle
Annotation und Annotation-basierte Konfiguration (Java-Konfiguration) sind zwei verschiedene Dinge, und das OP fragt nach dem späteren, während Sie über das erstere sprechen.
Glücklicher
6

Ich benutze Spring jetzt seit ein paar Jahren und die Menge an XML, die benötigt wurde, wurde definitiv langweilig. Zwischen den neuen XML-Schemas und der Unterstützung von Anmerkungen in Spring 2.5 mache ich normalerweise folgende Dinge:

  1. Verwenden von "component-scan" zum automatischen Laden von Klassen, die @Repository, @Service oder @Component verwenden. Normalerweise gebe ich jeder Bohne einen Namen und verdrahte sie dann mit @Resource. Ich finde, dass sich diese Installation nicht sehr oft ändert, daher sind Anmerkungen sinnvoll.

  2. Verwendung des Namespace "aop" für alle AOP. Das funktioniert wirklich gut. Ich benutze es immer noch auch für Transaktionen, weil das Platzieren von @Transactional überall eine Art Widerstand ist. Sie können benannte Pointcuts für Methoden in jedem Service oder Repository erstellen und die Hinweise sehr schnell anwenden.

  3. Ich verwende LocalContainerEntityManagerFactoryBean zusammen mit HibernateJpaVendorAdapter, um Hibernate zu konfigurieren. Auf diese Weise kann Hibernate @ Entity-Klassen im Klassenpfad einfach automatisch erkennen. Dann erstelle ich eine benannte SessionFactory-Bean mit "factory-bean" und "factory-method", die sich auf den LCEMFB beziehen.

cliff.meyers
quelle
5

Ein wichtiger Teil bei der Verwendung eines Nur-Annotation-Ansatzes besteht darin, dass das Konzept eines "Bean-Namens" mehr oder weniger verschwindet (unbedeutend wird).

Die "Bean-Namen" in Spring bilden eine zusätzliche Abstraktionsebene gegenüber den implementierenden Klassen. Mit XML werden Beans definiert und relativ zu ihrem Bean-Namen referenziert. Mit Anmerkungen werden sie von ihrer Klasse / Schnittstelle referenziert. (Obwohl der Bean-Name existiert, müssen Sie ihn nicht kennen.)

Ich bin der festen Überzeugung, dass das Entfernen überflüssiger Abstraktionen die Systeme vereinfacht und die Produktivität verbessert. Bei großen Projekten denke ich, dass die Gewinne durch das Entfernen von XML erheblich sein können.

Krosenvold
quelle
5

Ich denke, dass Sichtbarkeit mit einem XML-basierten Ansatz ein großer Gewinn ist. Ich finde, dass das XML angesichts der verschiedenen Tools zum Navigieren in XML-Dokumenten (dh dem Dateistrukturfenster von Visual Studio + ReSharper) nicht wirklich schlecht ist.

Sie können sicherlich einen gemischten Ansatz wählen, aber das erscheint mir schon deshalb gefährlich, weil es neuen Entwicklern in einem Projekt möglicherweise schwer fallen würde, herauszufinden, wo verschiedene Objekte konfiguriert oder zugeordnet sind.

Ich weiß es nicht; Am Ende scheint mir XML Hell gar nicht so schlecht zu sein.

Charles Chen
quelle
4

Dies hängt davon ab, was Sie alles konfigurieren möchten, da es einige Optionen gibt, die nicht mit Anmerkungen konfiguriert werden können. Wenn wir es von der Seite der Anmerkungen sehen:

  • Plus: Anmerkungen sind weniger gesprächig
  • Minus: Anmerkungen sind weniger sichtbar

Es liegt an Ihnen, was wichtiger ist ...

Im Allgemeinen würde ich empfehlen, einen Weg zu wählen und ihn über einen geschlossenen Teil des Produkts zu verwenden ...

(Mit einigen Ausnahmen: Wenn Sie beispielsweise XML-basierte Konfigurationen auswählen, ist es in Ordnung, die @ Autowire-Annotation zu verwenden. Sie mischt, aber diese verbessert sowohl die Lesbarkeit als auch die Wartbarkeit.)

Juraj
quelle
4

Es gibt andere Aspekte zu vergleichen, wie Refactoring und andere Codeänderungen. Wenn Sie XML verwenden, ist das Refactoring sehr aufwändig, da Sie sich um den gesamten XML-Inhalt kümmern müssen. Bei der Verwendung von Anmerkungen ist dies jedoch einfach.

Mein bevorzugter Weg ist die Java-basierte Konfiguration ohne (oder minimale) Anmerkungen. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java

Takacsot
quelle
3

Ich könnte mich irren, aber ich dachte, Anmerkungen (wie in Javas @Tag und C # [Attribut]) wären eine Option zur Kompilierungszeit und XML eine Laufzeitoption. Das sagt mir, dass die nicht gleichwertig sind und unterschiedliche Vor- und Nachteile haben.

ARKBAN
quelle
Die Tatsache, dass Annotationen eine Sache zur Kompilierungszeit sind, ist ein Vorteil der annotationsbasierten Konfiguration, jedoch sind sowohl Annotationen als auch XML Methoden zur Konfiguration und in diesem Zusammenhang erreichen sie dasselbe. z.B. Konfigurieren von Zuordnungen im Ruhezustand in einer XML-Datei im Gegensatz zur Verwendung von Anmerkungen für die Klasse.
Abarax
Ahhh, ich sehe meine Verwirrung. Die Frage hat mich irregeführt zu glauben, dass sie die Konfiguration von Daten beschreibt, die über reine Klassenmetadaten hinausgehen.
ARKBAN
3

Ich denke auch, dass eine Mischung das Beste ist, aber es hängt auch von der Art der Konfigurationsparameter ab. Ich arbeite an einem Seam-Projekt, das auch Spring verwendet, und stelle es normalerweise auf verschiedenen Entwicklungs- und Testservern bereit. Also habe ich mich getrennt:

  • Serverspezifische Konfiguration (wie absolute Pfade zu Ressourcen auf dem Server): Spring XML-Datei
  • Injizieren von Beans als Mitglieder anderer Beans (oder Wiederverwenden eines von Spring XML definierten Werts in vielen Beans): Anmerkungen

Der Hauptunterschied besteht darin, dass Sie den Code nicht für alle sich ändernden serverspezifischen Konfigurationen neu kompilieren müssen. Bearbeiten Sie einfach die XML-Datei. Es gibt auch den Vorteil, dass einige Konfigurationsänderungen von Teammitgliedern vorgenommen werden können, die nicht den gesamten beteiligten Code verstehen.

Cristian Vat
quelle
2

Im Rahmen des DI-Containers denke ich, dass annotationsbasiertes DI die Verwendung von Java-Annotation missbraucht. Wenn ich das sage, empfehle ich nicht, es in Ihrem Projekt weit verbreitet zu verwenden. Wenn Ihr Projekt wirklich die Leistung eines DI-Containers benötigt, würde ich empfehlen, Spring IoC mit einer XML-basierten Konfigurationsoption zu verwenden.

Wenn es nur um Unit-Tests geht, sollten Entwickler das Dependency Inject-Muster in ihrer Codierung anwenden und die Vorteile von Verspottungstools wie EasyMock oder JMock nutzen, um Abhängigkeiten zu umgehen.

Sie sollten versuchen, die Verwendung des DI-Containers im falschen Kontext zu vermeiden.

Thang
quelle
2

Konfigurationsinformationen, die immer mit einer bestimmten Java-Komponente (Klasse, Methode oder Feld) verknüpft werden, sind ein guter Kandidat für die Darstellung durch Anmerkungen. Anmerkungen funktionieren in diesem Fall besonders gut, wenn die Konfiguration für den Zweck des Codes von zentraler Bedeutung ist. Aufgrund der Einschränkungen bei Anmerkungen ist es auch am besten, wenn jede Komponente immer nur eine Konfiguration haben kann. Wenn Sie sich mit mehreren Konfigurationen befassen müssen, insbesondere solchen, die von etwas außerhalb der Java-Klasse abhängig sind, die eine Anmerkung enthält, können Anmerkungen mehr Probleme verursachen als sie lösen. Schließlich können Anmerkungen nicht geändert werden, ohne den Java-Quellcode neu zu kompilieren, sodass für alles, was zur Laufzeit neu konfiguriert werden muss, keine Anmerkungen verwendet werden können.

Bitte beachten Sie die folgenden Links. Sie könnten auch nützlich sein.

  1. Anmerkungen zu XML, Vor- und Nachteile
  2. http://www.ibm.com/developerworks/library/j-cwt08025/
tharindu_DG
quelle
1

Dies ist die klassische Frage "Konfiguration versus Konvention". Der persönliche Geschmack bestimmt in den meisten Fällen die Antwort. Ich persönlich bevorzuge jedoch die Konfiguration (dh XML-basiert) gegenüber der Konvention. IMO-IDEs sind robust genug, um einige der XML-Probleme zu überwinden, die häufig mit dem Aufbau und der Aufrechterhaltung eines XML-basierten Ansatzes verbunden sind. Am Ende überwiegen die Vorteile der Konfiguration (z. B. das Erstellen von Dienstprogrammen zum Erstellen, Verwalten und Bereitstellen der XML-Konfigurationsdatei) auf lange Sicht die Konvention.

Jason
quelle
6
Ich denke, "Konfiguration gegen Konvention" ist orthogonal zu diesem Thema. Sowohl Anmerkungen als auch XML-Dateien haben viele vernünftige Standardeinstellungen (Konventionen), die ihre Verwendung erheblich vereinfachen. Der wirkliche Unterschied besteht in der Kompilierungszeit gegenüber der Laufzeit und im In-Code gegenüber dem Out-of-Code.
HDave
1

Ich benutze beide. Meistens XML, aber wenn ich eine Reihe von Beans habe, die von einer gemeinsamen Klasse erben und gemeinsame Eigenschaften haben, verwende ich Anmerkungen für diese in der Oberklasse, sodass ich nicht für jede Bean die gleichen Eigenschaften festlegen muss. Da ich ein bisschen ein Kontrollfreak bin, verwende ich @Resource (name = "referedBean") anstatt nur automatisch zu verdrahten (und erspare mir viel Ärger, wenn ich jemals eine andere Bean der gleichen Klasse wie die ursprüngliche referedBean benötige). .

Chochos
quelle
1

Aus meiner Erfahrung gibt es einige Vor- und Nachteile der Annotationskonfiguration:

  • Wenn es um die JPA-Konfiguration geht, da sie einmal durchgeführt wird und normalerweise nicht oft geändert wird, halte ich mich lieber an die Annotation-Konfiguration. Möglicherweise besteht Bedenken hinsichtlich der Möglichkeit, ein größeres Bild der Konfiguration zu erhalten. In diesem Fall verwende ich MSQLWorkbench-Diagramme.
  • Die XML-Konfiguration ist sehr gut, um ein größeres Bild der Anwendung zu erhalten, aber es ist möglicherweise umständlich, bis zur Laufzeit einige Fehler zu finden. In diesem Fall ist die Annotation von Spring @Configuration die bessere Wahl, da Sie damit auch ein größeres Bild sehen und die Konfiguration zur Kompilierungszeit überprüfen können.
  • In Bezug auf die Spring-Konfiguration bevorzuge ich es, beide Ansätze zu kombinieren: Verwenden Sie die Annotation @Configuration mit Schnittstellen für Dienste und Abfragen und die XML-Konfiguration für DataSource- und Spring-Konfigurationsmaterialien wie den Kontext: component-scan base-package = "..."
  • Die XML-Konfiguration enthält jedoch Java-Anmerkungen zur Flow-Konfiguration (Spring Web Flow oder Lexaden Web Flow), da es äußerst wichtig ist, ein umfassenderes Bild des gesamten Geschäftsprozesses zu erhalten. Und es klingt umständlich, es mit Annotations-Ansatz implementieren zu lassen.

Ich bevorzuge es, beide Ansätze zu kombinieren - Java-Annotationen und ein wesentliches XML-Minimum, das die Konfigurationshölle minimiert.

Denis Skarbichev
quelle
1

Für Spring Framework gefällt mir die Idee, die Annotation @Component verwenden und die Option "Komponenten-Scan" festlegen zu können, damit Spring meine Java-Beans finden kann, sodass ich nicht alle meine Beans in XML oder in XML definieren muss JavaConfig. Beispielsweise funktioniert dieser Ansatz für zustandslose Singleton-Java-Beans, die einfach mit anderen Klassen verbunden werden müssen (idealerweise über eine Schnittstelle), sehr gut. Im Allgemeinen habe ich mich bei Spring Beans größtenteils von Spring XML DSL entfernt, um Beans zu definieren, und bevorzuge jetzt die Verwendung von JavaConfig und Spring Annotations, da Sie eine Überprüfung der Kompilierungszeit Ihrer Konfiguration und einige Refactoring-Unterstützung erhalten, die Sie nicht benötigen. Nicht mit Spring XML-Konfiguration erhalten. Ich mische die beiden in bestimmten seltenen Fällen, in denen ich festgestellt habe, dass JavaConfig / Annotations nicht das kann, was in der XML-Konfiguration verfügbar ist.

Für Hibernate ORM (habe JPA noch nicht verwendet) bevorzuge ich immer noch die XML-Zuordnungsdateien, da Anmerkungen in Domänenmodellklassen bis zu einem gewissen Grad gegen The Clean Architecture verstoßen, einen überlagerten Architekturstil, den ich in den letzten Jahren übernommen habe. Die Verletzung tritt auf, weil der Core Layer von persistenzbezogenen Dingen wie Hibernate- oder JPA-Bibliotheken abhängen muss und die POJOs des Domänenmodells weniger persistenzunabhängig sind. Tatsächlich sollte die Kernschicht überhaupt nicht von einer anderen Infrastruktur abhängen.

Wenn The Clean Architecture jedoch nicht Ihre "Tasse Tee" ist, kann ich feststellen, dass die Verwendung von Hibernate / JPA-Annotationen in Domänenmodellklassen gegenüber separaten XML-Zuordnungsdateien definitiv Vorteile (wie Bequemlichkeit und Wartbarkeit) bietet.

Whitestryder
quelle