[JAVA] So schreiben Sie den Spring AOP Point Cut Specifier

Überblick

Dies ist ein zusammenfassender Artikel zum Schreiben von AOP-Punktschnitt-Spezifizierern. Bitte beachten Sie, dass dieser Artikel keine Details zu AOP, Aspektimplementierung oder Beratung enthält. Bitte beachten Sie den separat verlinkten Referenzartikel.

Umgebung

Referenz

Point Cut Formel

Spezifizierer

Die Arten von AspectJ-Pointcut-Bezeichnern, die von Spring AOP unterstützt werden.

execution

for matching method execution join points, this is the primary pointcut designator you will use when working with Spring AOP

Format

format


execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
Abschnitt formatieren Muster Bemerkungen
modifiers-pattern Qualifikation Abkürzung
ret-type-pattern Rückgabetyp
declaring-type-pattern Deklarationstyp Abkürzung
name-pattern Methodenname
param-pattern Parametertyp
throws-pattern Ausnahmetyp Abkürzung

Beispiel


@Around("execution(public String com.example.*..*ServiceImpl.find*(String,Long,Long) throws Exception)")
                   ^^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
                   |      |      |                           |    |                  |
                   |      |      |                           |    |                  +--- throws-pattern
                   |      |      |                           |    +--- param-pattern
                   |      |      |                           +--- name-pattern
                   |      |      +--- declaring-type-pattern
                   |      +--- ret-type-pattern
                   +--- modifiers-pattern

Diese Bedingung entspricht der findOne-Methode der folgenden Klasse.

Beispiel


package com.example.service.impl;

@Service
public class EvianServiceImpl implements EvianService {

  //...Kürzung

  public String findOne(String title, Long id, Long price) throws Exception {
    //...Kürzung
  }

}

modifiers-pattern

Geben Sie das Qualifikationsmerkmal an. public ist optional. Da Spring AOP jedoch nur öffentliche Methoden unterstützt, ist es nicht erforderlich, diese explizit anzugeben.

Beispiel_(Ausgelassene Beschreibung)


@Around("execution(String *..*ServiceImpl.find*(String,Long,Long) throws Exception)")

Due to the proxy-based nature of Spring’s AOP framework, calls within the target object are by definition not intercepted. For JDK proxies, only public interface method calls on the proxy can be intercepted. With CGLIB, public and protected method calls on the proxy will be intercepted, and even package-visible methods if necessary. However, common interactions through proxies should always be designed through public signatures.

ret-type-pattern

Gibt das Rückgabemuster an. Wenn Sie den Typ nicht angeben müssen, können Sie ihn mit "*" schreiben.

Beispiel_(Rückgabewert*Beschrieben in)


@Around("execution(* *..*ServiceImpl.find*(String,Long,Long) throws Exception)")

declaring-type-pattern

Geben Sie den Paketnamen und das Klassennamenmuster an. Sie kann wie beschrieben durch teilweise Übereinstimmung angegeben werden. Es kann weggelassen werden.

Beispiel_(Ausgelassene Beschreibung)


@Around("execution(public String find*(..) throws Exception)")

name-pattern

Geben Sie das Methodennamenmuster an. Wie oben erwähnt, kann es durch teilweise Übereinstimmung angegeben werden.

Beispiel_(Beschreiben Sie den Methodennamen mit teilweiser Übereinstimmung)


find*(..)

Natürlich können Sie auch schreiben, ohne es auszulassen.

Beispiel_(Beschreibung nicht weggelassen)


findOne(..)

param-pattern

Gibt das Parametermuster an. Es gibt verschiedene Möglichkeiten, es zu beschreiben, aber Sie können es als ".." schreiben, wenn Sie es nicht angeben müssen.

Beispiel


@Around("execution(* *..*ServiceImpl.find*(..) throws Exception)")

Bei teilweiser Angabe. Wenn das erste Argument String ist und der zweite und die nachfolgenden Typen beliebig sind (es ist kein Argument erforderlich).

Beispiel


find*(String,..)

Wenn die Anzahl der Argumente festgelegt ist, der Typ jedoch nicht festgelegt ist, verwenden Sie Platzhalter.

Beispiel


find*(*,*,*)

Wenn Sie kein Argument nehmen.

Beispiel


find*()

throws-pattern

Gibt das Ausnahmemuster an. Sie können den Namen auch durch teilweise Übereinstimmung angeben.

Beispiel


@Around("execution(* *..*ServiceImpl.find*(..) throws *Exception)")

Es kann weggelassen werden.

Beispiel


@Around("execution(* *..*ServiceImpl.find*(..))")

within

limits matching to join points within certain types (simply the execution of a method declared within a matching type when using Spring AOP)

Gilt für die von FQCN angegebenen Methoden der Klasse.

OK


@Around("within(com.example.service.impl.WeatherServiceImpl)")

Gilt für die Methoden der Klasse unter dem angegebenen Paket.

OK


@Around("within(com.example.service.impl.*)")

Gilt für die Methoden der angegebenen Klasse.

OK


@Around("within(*..WeatherServiceImpl)")

Sie können keine Schnittstelle angeben.

NG


@Around("within(com.example.service.WeatherService)")
public interface WeatherService {
  //...Kürzung
}

Bindung

Innerhalb kann nicht gebunden werden.

@​within

limits matching to join points within types that have the given annotation (the execution of methods declared in types with the given annotation when using Spring AOP)

'@within' can also be used in a binding form :- see the following section on advice for how to make the annotation object available in the advice body.

Gilt für die Methoden der Klasse mit der angegebenen Anmerkung.

OK


@Around("@within(com.example.annotation.AopWithin)")

Beispiel


@AopWithin
@Service
public class WeatherServiceImpl implements WeatherService {
  //...Kürzung
}

Bindung

Sie können Anmerkungen an Berater binden.

OK


@Around("@within(aopWithin)")
public Object w4(ProceedingJoinPoint pjp, AopWithin aopWithin) throws Throwable {
  //...Kürzung
}

target

limits matching to join points (the execution of methods when using Spring AOP) where the target object (application object being proxied) is an instance of the given type

'target' is more commonly used in a binding form :- see the following section on advice for how to make the target object available in the advice body.

Gilt für die Methoden der angegebenen Schnittstelle oder Implementierungsklasse der abstrakten Klasse.

OK


@Around("target(com.example.service.AbstractService)")

Bindung

Sie können die Schnittstelle an einen Berater binden.

OK


@Around("target(service)")
public Object t2(ProceedingJoinPoint pjp, AbstractService service) throws Throwable {
  //...Kürzung
}

Da die Datenquelle auch eine Schnittstelle ist, kann sie wie unten gezeigt auf die Methoden der Datenquelle angewendet werden.

Beispiel


@Around("target(datasource)")
public Object b1(ProceedingJoinPoint pjp, DataSource datasource) throws Throwable {
  //...Kürzung
}

@​target

limits matching to join points (the execution of methods when using Spring AOP) where the class of the executing object has an annotation of the given type

'@target' can also be used in a binding form :- see the following section on advice for how to make the annotation object available in the advice body.

Ich bin mir nicht sicher. Ich habe es nachgeschlagen, aber ich habe es nicht verstanden.

args

'args' is more commonly used in a binding form :- see the following section on advice for how to make the method arguments available in the advice body.

Gilt für Methoden, die das angegebene Argument verwenden. Wenn Sie nur Argumente festlegen, tritt ein Laufzeitfehler auf, sodass wir das Ziel zusammen mit der Ausführung eingrenzen.

In diesem Beispiel wird es auf eine Methode angewendet, die eine Klasse namens WeatherForm als Argument verwendet.

OK


@Around("execution(* com.example.*..*.*(..)) && args(com.example.form.WeatherForm)")

Die für args angegebene Reihenfolge der Argumente ist wichtig. Wenn Sie ein anderes Argument als WeatherForm verwenden möchten, müssen Sie das Argument angeben oder ".." hinzufügen.

Beispiel


@Around("execution(* com.example.*..*.*(..)) && args(com.example.form.WeatherForm,..)")

Bindung

Sie können die Argumente an den Berater binden.

OK


@Around("execution(* com.example.*..*.*(..)) && args(form,..)")
public Object a2(ProceedingJoinPoint pjp, WeatherForm form) throws Throwable {
  //...Kürzung
}

@​args

'@args' can also be used in a binding form :- see the following section on advice for how to make the annotation object(s) available in the advice body.

Gilt für Methoden, die ein Objekt der Klasse mit der angegebenen Annotation als Argument verwenden.

OK


@Around("execution(* com.example.*..*.*(..)) && @args(com.example.annotation.AopTest)")

Beispiel


@AopTest
public class WeatherForm implements Serializable {
  //...Kürzung
}

Es kann nicht angewendet werden (es wird nicht wirksam), indem im Argument der Methode eine Anmerkung angegeben wird, wie unten gezeigt.

NG


public void forecast(@AopTest WeatherForm form) {
  //...Kürzung
}

Bindung

Sie können Anmerkungen an Berater binden.

OK


@Around("execution(* com.example.*..*.*(..)) && @args(aopTest)")
public Object a4(ProceedingJoinPoint pjp, AopTest aopTest) throws Throwable {
  //...Kürzung
}

bean

Geben Sie den Namen der Bean an, die vom Spring-Container verwaltet wird. Sie können im Namen Platzhalter verwenden. Dieses Beispiel gilt für eine Bean-Methode, die mit "ServiceImpl" endet.

Beispiel


@Around("bean(*ServiceImpl)")

@​annotation

'@annotation' can also be used in a binding form :- see the following section on advice for how to make the annotation object available in the advice body.

Gilt für die Methode mit der angegebenen Anmerkung.

OK


@Around("@annotation(com.example.annotation.AopTest)")

Beispiel


@AopTest
public void beforeTransaction() {
  //...Kürzung
}

Bindung

Sie können Anmerkungen an Berater binden.

OK


@Around("@annotation(aopTest)")
public Object a2(ProceedingJoinPoint pjp, AopTest aopTest) throws Throwable {
  //...Kürzung
}

Nicht unterstützter Pointcut-Bezeichner

Stand September 2017

The full AspectJ pointcut language supports additional pointcut designators that are not supported in Spring. These are: call, get, set, preinitialization, staticinitialization, initialization, handler, adviceexecution, withincode, cflow, cflowbelow, if, @this, and @withincode. Use of these pointcut designators in pointcut expressions interpreted by Spring AOP will result in an IllegalArgumentException being thrown.

Recommended Posts

So schreiben Sie den Spring AOP Point Cut Specifier
So führen Sie einen Komponententest für Spring AOP durch
Wie schreibe ich Rails
Über Spring AOP Pointcut
Wie schreibe ich Docker-Compose
Wie schreibe ich Mockito
So schreiben Sie eine Migrationsdatei
Wie schreibe ich einen Java-Kommentar
[Refactoring] So schreiben Sie Routing
Einführung in Spring Boot ② ~ AOP ~
Wie schreibe ich Rails Seed
Wie schreibe ich Rails Routing
Wie man Lombok im Frühling benutzt
Java # 6 studieren (Wie man Blöcke schreibt)
Hinweise zur Verwendung von Spring Data JDBC
[So installieren Sie Spring Data Jpa]
So stellen Sie Spring Boot + PostgreSQL ein
[Rails] Wie schreibe ich eine Ausnahmebehandlung?
So schreiben Sie eine Java-Variablendeklaration
Verwendung von ModelMapper (Spring Boot)
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
Wie kann ich Spring Tool in Eclipse 4.6.3 einbinden?
Zusammenfassung zum Schreiben von Anmerkungsargumenten
[Einführung in Java] So schreiben Sie ein Java-Programm
[Java] Wie man Dateien ausgibt und schreibt!
Antwortdaten direkt im Frühjahr schreiben
[Spring MVC] Übergeben von Pfadvariablen
So teilen Sie eine Spring Boot-Nachrichtendatei
[SpringBoot] So schreiben Sie einen Controller-Test
JDBC Versprechen und Schreibbeispiel
Schienen: Wie man eine Rechenaufgabe schön schreibt
[Java FX] So schreiben Sie Eclipse-Berechtigungen in build.gradle
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Wie schreibe ich eine if-Anweisung, um die Lesbarkeit von Java zu verbessern?
Verstehen, wie Spring DB-Verbindungen (DB-Transaktionen) freigegeben werden
So verkleinern Sie das Spring Boot Docker-Image
Über Spring AOP
JUnit 5: Wie man Testfälle in enum schreibt
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
Über den Frühling AOP
Beispiel für die Implementierung der F06-Implementierung in Echtzeit
Wie man Code schreibt, der objektorientiertes Ruby denkt
So schreiben Sie Testcode mit Basic-Zertifizierung
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Wie schreibe ich React Native Bridge ~ Android-Version ~
So definieren Sie mehrere orm.xml in Spring4, JPA2.1