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
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
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
}
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
}
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)")
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,..)")
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
}
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
}
Sie können Anmerkungen an Berater binden.
OK
@Around("@annotation(aopTest)")
public Object a2(ProceedingJoinPoint pjp, AopTest aopTest) throws Throwable {
//...Kürzung
}
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