Einführung in Spring AOP

1. Einleitung

In diesem Tutorial werden wir AOP (Aspect Oriented Programming) mit Spring vorstellen und verstehen, wie wir dieses leistungsstarke Tool in praktischen Szenarien einsetzen können.

Es ist auch möglich, die Annotationen von AspectJ bei der Entwicklung mit Spring AOP zu nutzen. In diesem Artikel konzentrieren wir uns jedoch auf die XML-basierte Kernkonfiguration von Spring AOP.

2. Übersicht

AOP ist ein Programmierparadigma, das darauf abzielt, die Modularität zu erhöhen, indem Querschnittsthemen getrennt werden. Dazu wird dem vorhandenen Code zusätzliches Verhalten hinzugefügt, ohne dass der Code selbst geändert wird.

Stattdessen können wir diesen neuen Code und diese neuen Verhaltensweisen separat deklarieren.

Das AOP-Framework von Spring hilft uns, diese Querschnittsthemen umzusetzen.

3. Maven-Abhängigkeiten

Beginnen wir mit dem Hinzufügen der AOP-Bibliotheksabhängigkeit von Spring in der Datei pom.xml :

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE    org.springframework.boot spring-boot-starter-aop  

Die neueste Version der Abhängigkeit kann hier überprüft werden.

4. AOP-Konzepte und Terminologie

Lassen Sie uns kurz auf die Konzepte und Terminologie von AOP eingehen:

4.1. Geschäftsgegenstand

Ein Geschäftsobjekt ist eine normale Klasse mit einer normalen Geschäftslogik. Schauen wir uns ein einfaches Beispiel eines Geschäftsobjekts an, bei dem wir nur zwei Zahlen hinzufügen:

public class SampleAdder { public int add(int a, int b) { return a + b; } } 

Beachten Sie, dass diese Klasse eine normale Klasse mit Geschäftslogik und ohne Spring-bezogene Anmerkungen ist.

4.2. Aspekt

Ein Aspekt ist die Modularisierung eines Unternehmens, das mehrere Klassen umfasst. Die einheitliche Protokollierung kann ein Beispiel für ein solches Querschnittsthema sein.

Mal sehen, wie wir einen einfachen Aspekt definieren:

public class AdderAfterReturnAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); public void afterReturn(Object returnValue) throws Throwable { logger.info("value return was {}", returnValue); } } 

Im obigen Beispiel haben wir gerade eine einfache Java-Klasse definiert, die eine Methode namens afterReturn hat , die ein Argument vom Typ Object verwendet und nur diesen Wert protokolliert. Beachten Sie, dass auch unser AdderAfterReturnAspect eine Standardklasse ist, die keine Frühlingsanmerkungen enthält.

In den nächsten Abschnitten werden wir sehen, wie wir diesen Aspekt mit unserem Geschäftsobjekt verbinden können.

4.3. Joinpoint

Ein Joinpoint ist ein Punkt während der Ausführung eines Programms, z. B. die Ausführung einer Methode oder die Behandlung einer Ausnahme.

In Spring AOP repräsentiert ein JoinPoint immer eine Methodenausführung.

4.4. Pointcut

Ein Pointcut ist ein Prädikat, mit dessen Hilfe ein Ratschlag abgeglichen werden kann, der von einem Aspekt auf einen bestimmten JoinPoint angewendet wird .

Der Hinweis wird häufig mit einem Pointcut- Ausdruck verknüpft und an jedem Joinpoint ausgeführt , der mit dem Pointcut übereinstimmt.

4.5. Rat

Ein Rat ist eine Aktion, die von einem Aspekt an einem bestimmten Joinpoint ausgeführt wird . Verschiedene Arten von Ratschlägen umfassen "um", "vor" und "nach" Ratschläge.

Im Frühjahr, eine Beratung wird als Abfangjäger modelliert, eine Kette von Abfangraketen um die Aufrechterhaltung Joinpoint .

4.6. Verkabelung des Geschäftsobjekts und -aspekts

Schauen wir uns an, wie wir ein Geschäftsobjekt mit einem Aspekt nach der Rückgabe mit einem Aspekt verbinden können.

Unten finden Sie den Konfigurationsauszug, den wir in einer Standard-Spring-Konfiguration im Tag "" platzieren würden :

Wie zu sehen ist, haben wir eine einfache Bean namens simpleAdder definiert, die eine Instanz eines Geschäftsobjekts darstellt. Darüber hinaus erstellen wir eine Instanz eines Aspekts namens AdderAfterReturnAspect .

XML ist hier natürlich nicht unsere einzige Option. Wie bereits erwähnt, werden auch AspectJ-Anmerkungen vollständig unterstützt.

4.7. Konfiguration auf einen Blick

Tag aop: config wird zum Definieren der AOP-bezogenen Konfiguration verwendet. Innerhalb des Konfigurations- Tags definieren wir die Klasse, die einen Aspekt darstellt. Wir haben ihm eine Referenz der von uns erstellten Aspekt-Bean "doAfterReturningAspect" gegeben .

Als Nächstes definieren wir einen Pointcut mithilfe des Pointcut- Tags. Der im obigen Beispiel verwendete Pointcut ist die Ausführung (* org.baeldung.logger.SampleAdder +. * (..)). Dies bedeutet, dass Sie einen Hinweis auf eine Methode innerhalb der SampleAdder- Klasse anwenden , die eine beliebige Anzahl von Argumenten akzeptiert und einen beliebigen Werttyp zurückgibt.

Next, we define which advice we want to apply. In the above example, we're going to apply after-returning advice which is defined in our Aspect AdderAfterReturnAspect by executing method named afterReturn defined using attribute method.

This advice within Aspect takes one parameter of type Object. The parameter gives us an opportunity to take an action before and/or after the target method call. In this case, we just log the method’s return value.

Spring AOP supports multiple advices using annotation-based config – this and more examples can be found here and here.

5. Conclusion

In this tutorial, we illustrated concepts used in AOP and example of using the AOP module of Spring. If you're interested in discovering more about AOP, here're some resources:

  • Eine Einführung in AspectJ
  • Implementieren einer benutzerdefinierten Spring AOP-Annotation
  • Eine Einführung in Pointcut Expressions im Frühjahr
  • Vergleich von Spring AOP und AspectJ
  • Eine Einführung in Beratungstypen im Frühjahr

Die Implementierung dieser Beispiele finden Sie im GitHub-Projekt - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.