it-swarm.com.de

Frühling AOP vs AspectJ

Ich habe den Eindruck, dass Spring AOP am besten für anwendungsspezifische Aufgaben wie Sicherheit, Protokollierung, Transaktionen usw. verwendet wird, da benutzerdefinierte Java5-Anmerkungen als Framework verwendet werden. AspectJ scheint jedoch ein freundlicheres Designmuster zu sein. 

Kann jemand die verschiedenen Vor- und Nachteile der Verwendung von Spring AOP vs. AspectJ in einer Spring-Anwendung hervorheben?

156
zotherstupidguy

Spring-AOP Pros

  • Es ist einfacher zu verwenden als AspectJ, da Sie nicht LTW ( Ladezeitweben ) oder den AspectJ-Compiler verwenden müssen.

  • Es verwendet das Proxy-Muster und das Decorator-Muster

Spring-AOP Cons

  • Dies ist ein Proxy-basiertes AOP. Daher können Sie grundsätzlich nur Methoden-Ausführungs-Joinpoints verwenden.
  • Aspekte werden nicht angewendet, wenn eine andere Methode innerhalb derselben Klasse aufgerufen wird.
  • Es kann etwas Laufzeitaufwand geben.
  • Spring-AOP kann keinen Aspekt hinzufügen, der nicht von der Spring-Factory erstellt wurde

AspectJ Pros

  • Dies unterstützt alle Joinpoints. Dies bedeutet, dass Sie alles tun können. 
  • Der Laufzeitaufwand ist geringer als der von Spring AOP.

AspectJ Cons

  • Achtung. Prüfen Sie, ob Ihre Aspekte nur mit dem verbunden sind, von dem Sie gewebt werden möchten.
  • Sie benötigen einen zusätzlichen Build-Prozess mit AspectJ Compiler oder müssen LTW (Ladezeitweberei) einrichten.
208
Whiteship

Abgesehen von dem, was andere angegeben haben - there are two major differences:

  1. Eine hängt mit der Webart zusammen. 
  2. Ein weiteres zur Definition des Joinpoint.

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

AspectJ: Compilierzeit durch AspectJ Java Tools(ajc compiler), wenn Quelle verfügbar ist oder Web-Post-Compilierung (mit kompilierten Dateien) Die Ladezeit für das Weben mit Spring kann ebenfalls aktiviert werden. Sie benötigt die Definitionsdatei aspectj und bietet Flexibilität.

Compilierzeit Weben kann (in einigen Fällen) Leistungsvorteile und auch den joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ. bieten.

21
techzen

Ein zusätzlicher Hinweis: Wenn Leistung unter hoher Last wichtig ist, sollten Sie AspectJ wünschen, das 9-35x schneller ist als Spring AOP. 10ns vs 355ns klingt vielleicht nicht viel, aber ich habe Leute gesehen, die LOTS of Aspects verwenden. Aspekte von 10K. In diesen Fällen kann Ihre Anfrage Tausende von Aspekten treffen. In diesem Fall fügen Sie der Anfrage ms hinzu.

Siehe die Benchmarks .

18
Joseph Lust

Die Frühjahrs-Bedienungsanleitung gibt viele Informationen direkt aus dem Munde des Pferdes. 

Das Kapitel 6.4 - Die Wahl des zu verwendenden AOP-Deklarationsstils ist für Sie kein Thema, da hier die Vor- und Nachteile von beiden erörtert werden.

Der Absatz 6.1.2 - Spring AOP-Funktionen und -Ziele & Kapitel 6.2 - @Aspect-Support und 6.8 - AspectJ mit Spring-Anwendungen verwenden sollte besonders interessant sein.

16
elhoim

Feder AOP ist einer der wesentlichen Bestandteile des Federrahmens. In der Grundphase basiert das Federgerüst auf IoC und AOP. Im offiziellen Verlauf des Frühlings gibt es eine Folie, in der es heißt:

Das AOP ist einer der wichtigsten Bestandteile des Rahmens.

Der Schlüssel zum Verständnis der Funktionsweise von AOP in Spring besteht darin, dass beim Erstellen eines Aspekts mit Spring das Framework mit dem Aufbau eines Proxys für Ihre Objekte instrumentiert wird, mit einer JDKDynamicProxy, wenn Ihr Bean eine Schnittstelle implementiert, oder über CGLIB, wenn Ihr Bean nicht implementiert ist eine beliebige Schnittstelle. Denken Sie daran, dass Sie cglib 2.2 in Ihrem Klassenpfad haben müssen, wenn Sie Spring vor Version 3.2 verwenden. Ab Spring 3.2 ist es unbrauchbar, da cglib 2.2 im Core enthalten war.

Das Framework bei der Bean-Erstellung erstellt einen Proxy, der Ihre Objekte umschließt und bereichsübergreifende Verantwortlichkeiten wie Sicherheit, Transaktionsverwaltung, Protokollierung usw. hinzufügt.

Die Proxy-Erstellung auf diese Weise wird angewendet, beginnend mit einem Pointcut-Ausdruck, mit dessen Hilfe das Framework entscheidet, welche Beans und Methoden als Proxys erstellt werden. Für die Beratung ist mehr als für Ihren Code verantwortlich. Denken Sie daran, dass der Pointcut in diesem Prozess nur öffentliche Methoden erfasst, die nicht als final deklariert sind.

Während in Spring AOP das Weben von Aspekten vom Container beim Start des Containers ausgeführt wird, müssen Sie dies in AspectJ mit einer Nachkompilierung Ihres Codes durch Bytecode-Änderung durchführen. Aus diesem Grund ist der Spring-Ansatz meiner Meinung nach einfacher und überschaubarer als AspectJ.

Andererseits können Sie mit dem Spring-AOP nicht die gesamte Leistungsfähigkeit von AOP nutzen, da die Implementierung über Proxys erfolgt und nicht durch Modifizieren des Codes.

Wie in AspectJ können Sie in SpringAOP das Weben der Ladezeit verwenden. Sie können von dieser Funktion profitieren, die im Frühjahr mit einem Agenten und speziellen Konfigurationen @EnabledLoadWeaving oder in XML implementiert wird. Sie können den Namensraum als Beispiel verwenden. In Spring AOP können Sie jedoch nicht alle Fälle abfangen. Beispielsweise wird der Befehl new in Spring AOP nicht unterstützt.

In Spring AOP können Sie jedoch von der Verwendung von AspectJ durch die Verwendung der Factory-Methode aspectof in der Spring-Konfigurations-Bean profitieren.

Aus dem Grund, dass Spring AOP im Grunde ein aus dem Container erstellter Proxy ist, können Sie AOP nur für Spring Beans verwenden. Bei AspectJ können Sie den Aspekt in allen Ihren Beans verwenden. Ein weiterer Vergleichspunkt ist das Debugging und die Vorhersagbarkeit des Codeverhaltens. Mit Spring AOP wird der Job vollständig vom Java-Compiler aus ausgeführt, und Aspekte sind eine sehr coole Möglichkeit, Proxy für Ihre Spring-Bean zu erstellen. Wenn Sie in AspectJ den Code ändern, müssen Sie mehr kompilieren und verstehen, wo Ihre Aspekte gewebt sind. Auch das Abschalten der Weberei im Frühjahr ist einfacher: Mit Spring entfernen Sie den Aspekt aus Ihrer Konfiguration, starten neu und es funktioniert. In AspectJ müssen Sie den Code neu kompilieren!

Beim Weben mit Ladezeit ist AspectJ flexibler als Spring, da Spring nicht alle Optionen von AspectJ unterstützt. Meiner Meinung nach. Wenn Sie den Erstellungsprozess einer Bean ändern möchten, ist es besser, das benutzerdefinierte Login in einer Fabrik zu verwalten und nicht mit dem Laden einer Komponente, die das Verhalten Ihres neuen Operators ändert.

Ich hoffe, dass dieses Panorama von AspectJ und Spring AOP Ihnen hilft, den Unterschied zwischen den beiden Tränken zu verstehen

9
Valerio Vaudi

Es ist wichtig zu überlegen, ob Ihre Aspekte geschäftskritisch sind und wo Ihr Code bereitgestellt wird. Spring AOP bedeutet, dass Sie sich auf das Weben der Ladezeit verlassen. Dies kann fehlschlagen, und nach meiner Erfahrung bedeutet das, dass protokollierte Fehler vorhanden sind, die Anwendung jedoch nicht ohne Aspektcode ablaufen kann nicht der Fall; aber mir ist das nicht persönlich bewusst]. Kompilierzeitweberei vermeidet dies. 

Wenn Sie AspectJ zusammen mit dem Aspektj-Maven-Plugin verwenden, können Sie außerdem Komponententests mit Ihren Aspekten in einer CI-Umgebung durchführen und sich darauf verlassen, dass erstellte Artefakte getestet und richtig gewebt werden. Sie können zwar Spring-Unit-Tests schreiben, haben jedoch keine Garantie, dass der bereitgestellte Code derjenige ist, der getestet wurde, wenn LTW ausfällt.

Eine weitere Überlegung ist, ob Sie die Anwendung in einer Umgebung hosten, in der Sie den Erfolg oder Misserfolg eines Server-/Anwendungsstarts direkt überwachen können, oder ob Ihre Anwendung in einer Umgebung bereitgestellt wird, in der sie nicht Ihrer Aufsicht unterliegt (z. B. wo es von einem Client gehostet wird]. Dies würde wiederum den Weg für das Zusammenstellen der Zeitwebung weisen.

Vor fünf Jahren war ich viel mehr für Spring-konfiguriertes AOP aus dem einfachen Grund, dass es einfacher war, damit zu arbeiten, und es weniger wahrscheinlich ist, meine IDE zu zähmen. Mit zunehmender Rechenleistung und verfügbarem Arbeitsspeicher ist dies jedoch ein viel geringeres Problem, und CTW mit dem Aspektj-maven-Plugin ist aus meinen oben genannten Gründen eine bessere Wahl in meiner Arbeitsumgebung.

0
kcampbell

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

Frühling AOP und AspectJ haben unterschiedliche Ziele.

Spring AOP zielt darauf ab, eine einfache AOP-Implementierung für Spring zu bieten IoC zur Lösung der häufigsten Probleme, mit denen Programmierer konfrontiert sind.

Auf der anderen Seite ist AspectJ die ursprüngliche AOP-Technologie, die auf .__ abzielt. bieten eine vollständige AOP-Lösung.

0
gce