Einführung in Beratungstypen im Frühjahr

1. Übersicht

In diesem Artikel werden verschiedene Arten von AOP-Ratschlägen erläutert, die im Frühjahr erstellt werden können.

Beratung ist eine Aktion, die von einem Aspekt an einem bestimmten Verbindungspunkt ausgeführt wird. Verschiedene Arten von Ratschlägen umfassen "um", "vor" und "nach" Ratschläge. Der Hauptzweck von Aspekten besteht darin, Querschnittsthemen wie Protokollierung, Profilerstellung, Caching und Transaktionsmanagement zu unterstützen.

Wenn Sie sich eingehender mit Pointcut-Ausdrücken befassen möchten, lesen Sie das vorherige Intro zu diesen.

2. Ratschläge aktivieren

Mit Spring können Sie Ratschläge mithilfe von AspectJ-Annotationen deklarieren. Sie müssen jedoch zuerst die Annotation @EnableAspectJAutoProxy auf Ihre Konfigurationsklasse anwenden, damit die mit AspectJs Annotation @Aspect gekennzeichneten Komponenten unterstützt werden .

@Configuration @EnableAspectJAutoProxy public class AopConfiguration { ... }

2.1. Frühlingsstiefel

In Spring Boot-Projekten müssen wir @EnableAspectJAutoProxy nicht explizit verwenden . Es gibt eine spezielle AopAutoConfiguration Spring AOP - Unterstützung , wenn die , die ermöglicht Aspect oder Beratung ist auf dem Classpath.

3. Vor dem Rat

Dieser Rat wird, wie der Name schon sagt, vor dem Join-Punkt ausgeführt. Die weitere Ausführung der empfohlenen Methode wird nur verhindert, wenn eine Ausnahme ausgelöst wird.

Betrachten Sie den folgenden Aspekt, der den Methodennamen einfach protokolliert, bevor er aufgerufen wird:

@Component @Aspect public class LoggingAspect { private Logger logger = Logger.getLogger(LoggingAspect.class.getName()); @Pointcut("@target(org.springframework.stereotype.Repository)") public void repositoryMethods() {}; @Before("repositoryMethods()") public void logMethodCall(JoinPoint jp) { String methodName = jp.getSignature().getName(); logger.info("Before " + methodName); } }

Der logMethodCall- Hinweis wird vor jeder durch den RepositoryMethods- Pointcut definierten Repository-Methode ausgeführt .

4. Nach Beratung

Nach dem Hinweis, der mithilfe der Annotation @After deklariert wurde , wird nach der Ausführung einer übereinstimmenden Methode ausgeführt, ob eine Ausnahme ausgelöst wurde oder nicht.

In gewisser Weise ähnelt es einem finally- Block. Im Fall , dass Sie nur ausgelöst werden beraten , nachdem die normale Ausführung, sollten Sie die Verwendung der Rückkehr Beratung durch erklärt @AfterReturning Anmerkung. Wenn Sie möchten, dass Ihr Hinweis nur ausgelöst wird, wenn die Zielmethode eine Ausnahme auslöst , sollten Sie einen Hinweis verwenden, der mithilfe der Annotation @AfterThrowing deklariert wird .

Angenommen, wir möchten einige Anwendungskomponenten benachrichtigen, wenn eine neue Instanz von Foo erstellt wird. Wir könnten eine Veranstaltung von FooDao veröffentlichen, dies würde jedoch gegen das Prinzip der Einzelverantwortung verstoßen.

Stattdessen können wir dies erreichen, indem wir den folgenden Aspekt definieren:

@Component @Aspect public class PublishingAspect { private ApplicationEventPublisher eventPublisher; @Autowired public void setEventPublisher(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } @Pointcut("@target(org.springframework.stereotype.Repository)") public void repositoryMethods() {} @Pointcut("execution(* *..create*(Long,..))") public void firstLongParamMethods() {} @Pointcut("repositoryMethods() && firstLongParamMethods()") public void entityCreationMethods() {} @AfterReturning(value = "entityCreationMethods()", returning = "entity") public void logMethodCall(JoinPoint jp, Object entity) throws Throwable { eventPublisher.publishEvent(new FooCreationEvent(entity)); } }

Beachten Sie zunächst, dass wir mithilfe der Annotation @AfterR eturning auf den Rückgabewert der Zielmethode zugreifen können. Zweitens können wir durch Deklarieren eines Parameters vom Typ JoinPoint auf die Argumente des Aufrufs der Zielmethode zugreifen.

Als nächstes erstellen wir einen Listener, der das Ereignis einfach protokolliert:

@Component public class FooCreationEventListener implements ApplicationListener { private Logger logger = Logger.getLogger(getClass().getName()); @Override public void onApplicationEvent(FooCreationEvent event) { logger.info("Created foo instance: " + event.getSource().toString()); } }

5. Rund um Rat

Rund um Ratschläge umgibt einen Verknüpfungspunkt wie einen Methodenaufruf.

Dies ist die mächtigste Art von Rat. Around-Ratschläge können sowohl vor als auch nach dem Methodenaufruf ein benutzerdefiniertes Verhalten ausführen. Es ist auch dafür verantwortlich, zu entscheiden, ob Sie zum Verknüpfungspunkt fortfahren oder die empfohlene Methodenausführung verkürzen möchten, indem Sie einen eigenen Rückgabewert angeben oder eine Ausnahme auslösen.

Angenommen, wir möchten die Ausführungszeit der Methode messen, um ihre Verwendung zu demonstrieren. Lassen Sie uns einen Aspekt dafür erstellen:

@Aspect @Component public class PerformanceAspect { private Logger logger = Logger.getLogger(getClass().getName()); @Pointcut("within(@org.springframework.stereotype.Repository *)") public void repositoryClassMethods() {}; @Around("repositoryClassMethods()") public Object measureMethodExecutionTime(ProceedingJoinPoint pjp) throws Throwable { long start = System.nanoTime(); Object retval = pjp.proceed(); long end = System.nanoTime(); String methodName = pjp.getSignature().getName(); logger.info("Execution of " + methodName + " took " + TimeUnit.NANOSECONDS.toMillis(end - start) + " ms"); return retval; } }

Dieser Hinweis wird ausgelöst, wenn einer der Verknüpfungspunkte ausgeführt wird, die mit dem Punktschnitt repositoryClassMethods übereinstimmen .

Dieser Hinweis verwendet einen Parameter vom Typ ProceedingJointPoint . Der Parameter gibt uns die Möglichkeit, vor dem Aufruf der Zielmethode Maßnahmen zu ergreifen. In diesem Fall speichern wir einfach die Startzeit der Methode.

Zweitens ist der Rückgabetyp "Hinweis" Objekt, da die Zielmethode ein Ergebnis eines beliebigen Typs zurückgeben kann. Wenn die Zielmethode ungültig ist, wird null zurückgegeben. Nach dem Aufruf der Zielmethode können wir das Timing messen, protokollieren und den Ergebniswert der Methode an den Aufrufer zurückgeben.

6. Übersicht

In diesem Artikel haben wir die verschiedenen Arten von Ratschlägen im Frühjahr sowie deren Erklärungen und Implementierungen kennengelernt. Wir haben Aspekte mithilfe eines schemabasierten Ansatzes und mithilfe von AspectJ-Annotationen definiert. Wir haben auch mehrere mögliche Beratungsanträge gestellt.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in meinem GitHub-Projekt.