Frage

Ich habe den Eindruck, dass Frühlings -AOP am besten für anwendungsspezifische Aufgaben wie Sicherheit, Protokollierung, Transaktionen usw. verwendet wird, da benutzerdefinierte JAVA5 -Anmerkungen als Framework verwendet werden. Aspektej scheint jedoch freundlicher zu machen.

Kann jemand die verschiedenen Vor- und Nachteile der Verwendung von Feder AOP vs Aspektj in einer Frühlingsanwendung hervorheben?

War es hilfreich?

Lösung

Spring-aop Pros

  • Es ist einfacher zu verwenden als Aspektj, da Sie LTW nicht verwenden müssen (Ladezeitweben) oder der Aspekt -J -Compiler.

  • Es verwendet das Proxy -Muster und das Dekorateurmuster

Spring-aop Cons

  • Dies ist Proxy-basierte AOP, daher können Sie im Grunde nur die Methodenverbindungen verwenden.
  • Aspekte werden nicht angewendet, wenn eine andere Methode innerhalb derselben Klasse aufgerufen wird.
  • Es kann ein wenig Laufzeit über Kopf geben.
  • Spring-Aop kann nichts zu etwas hinzufügen, das von der Frühlingsfabrik nicht erstellt wird

Aspektj Profis

  • Dies unterstützt alle Joinpoints. Dies bedeutet, dass Sie alles tun können.
  • Es gibt weniger Laufzeit über Kopf als die von Frühlings -AOP.

Aspektjs

  • Vorsichtig sein. Überprüfen Sie, ob Ihre Aspekte nur auf das verwebt sind, was Sie gewebt werden wollten.
  • Sie benötigen einen zusätzlichen Erstellungsprozess mit einem Aspektj Compiler oder müssen LTW (Ladezeitweben) einrichten,

Andere Tipps

Abgesehen von dem, was andere gesagt haben - nur um neu zu reformieren, there are two major differences:

  1. Man hängt mit der Art des Webers zusammen.
  2. Ein anderer zur Joinpoint -Definition.

Spring-Aop: Laufzeitweben durch Proxy mit dem Konzept von dynamic proxy if interface exists or cglib library if direct implementation provided.

Aspektj: Zeitlich zusammenweben AspectJ Java Tools(ajc compiler) Wenn Quelle verfügbar oder nach Kompilierungsweben (unter Verwendung kompilierter Dateien). Außerdem kann das Ladezeitwebeln mit der Feder aktiviert werden - es benötigt die aspectj Definitionsdatei und bietet Flexibilität.

Kompilieren Sie das Zeitweber kann (in einigen Fällen) und auch die Vorteile von Leistung bieten, und auch die joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.

Das Federbenutzerhandbuch Wird viele Informationen direkt aus dem Mund des Pferdes geben.

Das Kapitel 6.4 - Auswählen, welcher AOP -Deklarationsstil verwendet werden soll ist tot für Sie, da es die Vor- und Nachteile von beidem bespricht.

Der Paragraph 6.1.2 - Frühlings -AOP -Fähigkeiten und -ziele & Kapitel 6.2 - @aspect Support und 6.8 - Verwenden von Aspektj mit Federanwendungen sollte besonders interessant sein.

Eine zusätzliche Anmerkung: Wenn die Leistung unter hoher Belastung wichtig ist, möchten Sie Aspektj, der 9-35x schneller als Frühlings-AOP ist. 10ns gegenüber 355ns klingen vielleicht nicht nach viel, aber ich habe Leute gesehen, die viele Aspekte verwenden. Aspekte im Wert von 10K. In diesen Fällen kann Ihre Anfrage tausend Aspekte treffen. In diesem Fall fügen Sie dieser Anfrage MS hinzu.

Siehe das Benchmarks.

Frühlings -AOP ist einer der wesentlichen Teile des Frühlingsgerüsts. Auf der grundlegenden Phase basiert das Spring -Framework auf IOC und AOP. Im offiziellen Frühlingskurs gibt es eine Rutsche, in der es heißt:

Die AOP ist einer der wichtigsten Teile des Rahmens.

Der wichtigste Punkt für das Verständnis, wie AOP im Frühjahr funktioniert JDKDynamicProxy Wenn Ihre Bean eine Schnittstelle oder über CGlib implementiert, wenn Ihre Bean keine Schnittstelle implementiert. Denken Sie daran, dass Sie CGGLIB 2.2 in Ihrem Klassenpfad haben müssen, wenn Sie Frühling vor Version 3.2 verwenden. Ab dem Frühling 3.2 ist es nutzlos, da CGGLIB 2.2 in den Kern aufgenommen wurde.

Das Framework bei der Bean -Erstellung erzeugt einen Proxy, der Ihre Objekte umhüllt und die Verantwortlichkeiten wie Sicherheit, Transaktionsmanagement, Protokollierung usw. um Cross -Cut -Bedenken hinweg verleiht.

Die Proxy -Erstellung wird auf diese Weise angewendet, um einen Pointcut -Ausdruck zu erzielen, der das Rahmen instrumentiert, um zu entscheiden, welche Bohnen und Methoden als Proxies erstellt werden. Der Rat ist die Verantwortung als für Ihren Code. Denken Sie daran, dass der Pointcut in diesem Prozess nur öffentliche Methoden erfasst, die nicht als endgültig erklärt werden.

Während im Frühjahr das Weben von Aspekten vom Container beim Container-Start-up durchgeführt wird, müssen Sie dies in AspektJ mit einer Postkompilierung Ihres Codes durch Bytecode-Modifikation durchführen. Aus diesem Grund ist der Frühlingsansatz aus diesem Grund einfacher und überschaubarer als Aspektj.

Auf der anderen Seite können Sie mit der Feder AOP nicht die gesamte Leistung von AOP verwenden, da die Implementierung durch Proxys und nicht durch Änderung Ihres Codes durchgeführt wird.

Wie in AspektJ können Sie in Springaop das Weben der Ladezeit verwenden. Sie können von dieser Funktion in Spring profitieren, wird mit einem Agenten und speziellen Konfigurationen implementiert. @EnabledLoadWeaving oder in xml. Sie können den Namensraum als Beispiel verwenden. Im Frühlings -AOP können Sie jedoch nicht alle Fälle abfangen. Zum Beispiel die new Der Befehl wird im Frühjahr AOP nicht unterstützt.

Im Frühlings -AOP können Sie jedoch von der Verwendung von Aspektj durch die Verwendung der Nutzung profitieren aspectof Fabrikmethode in der Federkonfigurationsbohne.

Aus dem Grund, dass Frühlings -AOP im Grunde ein aus dem Behälter erstellter Proxy ist, können Sie AOP nur für Federbohnen verwenden. Mit Aspektj können Sie den Aspekt in all Ihren Bohnen verwenden. Ein weiterer Vergleichspunkt ist Debug und die Vorhersagbarkeit des Codeverhaltens. Mit Frühlings -AOP wird der Job vom Java -Compiler vorgebildet, und Aspekte sind eine sehr coole Möglichkeit, Proxy für Ihre Frühlingsbohne zu erstellen. In AspektJ, wenn Sie den Code ändern, benötigen Sie mehr Kompilieren und um zu verstehen, wo Ihre Aspekte gewebt werden könnten. Sogar das Herunterfahren des Webens im Frühjahr ist einfacher: Mit der Feder entfernen Sie den Aspekt aus Ihrer Konfiguration, starten Sie neu und es funktioniert. In AspektJ müssen Sie den Code neu kompilieren!

Bei der Ladezeitweben ist Aspektj flexibler als die Frühling, da die Frühling nicht alle Optionen von Aspektj unterstützt. Wenn Sie jedoch den Erstellungsprozess einer Bohne ändern möchten, können Sie das benutzerdefinierte Anmeldung in einer Fabrik besser verwalten und nicht mit der Ladezeit ein Aspekt, der das Verhalten Ihres neuen Bedieners ändert.

Ich hoffe, dass dieses Panorama von Aspektj und Frühlings -AOP Ihnen hilft, den Unterschied der beiden Tränke zu verstehen

Es ist wichtig zu prüfen, ob Ihre Aspekte aufwendig kritisch sind und wo Ihr Code bereitgestellt wird. Feder AOP bedeutet, dass Sie sich auf das Weben der Ladezeit verlassen. Dies kann nicht weben, und meiner Erfahrung Ich würde die Einschränkung hinzufügen, dass es möglich sein kann, sie so zu konfigurieren, dass dies nicht der Fall ist. Aber ich bin mir dessen nicht persönlich bewusst]. Das Weben von Kompilierzeit vermeidet dies.

Wenn Sie Aspektj in Verbindung mit dem Aspektj-Maven-Plugin verwenden, können Sie in einer CI-Umgebung Unit-Tests gegen Ihre Aspekte durchführen und Vertrauen haben, dass gebaute Artefakte getestet und korrekt gewebt werden. Während Sie sicherlich federgetriebene Unit -Tests schreiben können, haben Sie immer noch keine Garantie dafür, dass der bereitgestellte Code der getestet wurde, wenn LTW fehlschlägt.

Eine weitere Überlegung ist, ob Sie die Anwendung in einer Umgebung hosten, in der Sie den Erfolg oder Fehler eines Server- / Anwendungsstarts direkt überwachen können oder ob Ihre Anwendung in einer Umgebung bereitgestellt wird, in der sie nicht unter Ihrer Aufsicht steht wird von einem Kunden gehostet]. Dies würde auch den Weg zum Zusammenstellen von Zeitweben hinweisen.

Vor fünf Jahren war ich viel mehr für den Frühling -Konfigurations -AOP aus dem einfachen Grund, mit dem es einfacher war, meine IDE zu arbeiten, und weniger wahrscheinlich. Da die Rechenleistung und der verfügbare Speicher erhöht haben, ist dies jedoch viel weniger ein Problem geworden, und CTW mit dem Aspektj-Maven-Plugin ist in meiner Arbeitsumgebung zu einer besseren Wahl geworden, basierend auf den oben beschriebenen Gründen.

Dies Artikel hat auch eine gute Erklärung zum Thema.

Frühlings -AOP und Aspektj haben unterschiedliche Ziele.

Das Frühlings -AOP zielt darauf ab, eine einfache AOP -Implementierung für das Frühjahr -IOC bereitzustellen, um die häufigsten Probleme zu lösen, mit denen Programmierer konfrontiert sind.

Auf der anderen Seite ist Aspektj die ursprüngliche AOP -Technologie, die eine vollständige AOP -Lösung bereitstellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top