[JAVA] Comment écrire un spécificateur de coupe de point Spring AOP

Aperçu

Ceci est un article de synthèse sur la façon d'écrire des spécificateurs de coupes de points AOP. Veuillez noter que cet article ne couvre pas les détails de l'AOP, de la mise en œuvre d'Aspect ou des conseils. Veuillez consulter l'article de référence lié séparément.

environnement

référence

Formule Point Cut

Prescripteur

Les types de désignateurs de coupe de point AspectJ pris en charge par Spring AOP.

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?)
Section Format modèle Remarques
modifiers-pattern Qualificatif Abréviation
ret-type-pattern Type de retour
declaring-type-pattern Type de déclaration Abréviation
name-pattern Nom de la méthode
param-pattern Type de paramètre
throws-pattern Type d'exception Abréviation

Exemple


@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

Cette condition correspond à la méthode findOne de la classe ci-dessous.

Exemple


package com.example.service.impl;

@Service
public class EvianServiceImpl implements EvianService {

  //...réduction

  public String findOne(String title, Long id, Long price) throws Exception {
    //...réduction
  }

}

modifiers-pattern

Spécifiez le qualificatif. public est facultatif. Cependant, étant donné que Spring AOP ne prend en charge que les méthodes publiques, il n'est pas nécessaire de le spécifier explicitement.

Exemple_(Description omise)


@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

Spécifie le modèle de retour. Si vous n'avez pas besoin de spécifier le type, vous pouvez l'écrire avec "*".

Exemple_(Valeur de retour*Décrit dans)


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

declaring-type-pattern

Spécifiez le nom du package et le modèle de nom de classe. Il peut être spécifié par correspondance partielle comme décrit. Il peut être omis.

Exemple_(Description omise)


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

name-pattern

Spécifiez le modèle de nom de méthode. Comme mentionné ci-dessus, il peut être spécifié par correspondance partielle.

Exemple_(Décrivez le nom de la méthode avec une correspondance partielle)


find*(..)

Bien sûr, vous pouvez également écrire sans l'omettre.

Exemple_(Description non omise)


findOne(..)

param-pattern

Spécifie le modèle de paramètre. Il y a plusieurs manières de le décrire, mais vous pouvez l'écrire comme ".." si vous n'avez pas besoin de le spécifier.

Exemple


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

Lors de la spécification partielle. Lorsque le premier argument est String et que le deuxième type et les suivants sont arbitraires (aucun argument n'est nécessaire).

Exemple


find*(String,..)

Si le nombre d'arguments est fixe mais que le type n'est pas fixe, utilisez des caractères génériques.

Exemple


find*(*,*,*)

En ne prenant aucun argument.

Exemple


find*()

throws-pattern

Spécifie le modèle d'exception. Vous pouvez également spécifier par correspondance partielle du nom.

Exemple


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

Il peut être omis.

Exemple


@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)

S'applique aux méthodes de la classe spécifiée par FQCN.

OK


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

S'applique aux méthodes de la classe sous le package spécifié.

OK


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

S'applique aux méthodes de la classe spécifiée.

OK


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

Vous ne pouvez pas spécifier une interface.

NG


@Around("within(com.example.service.WeatherService)")
public interface WeatherService {
  //...réduction
}

contraignant

L'intérieur ne peut pas être lié.

@​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.

S'applique aux méthodes de la classe avec l'annotation spécifiée.

OK


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

Exemple


@AopWithin
@Service
public class WeatherServiceImpl implements WeatherService {
  //...réduction
}

contraignant

Vous pouvez lier des annotations aux conseillers.

OK


@Around("@within(aopWithin)")
public Object w4(ProceedingJoinPoint pjp, AopWithin aopWithin) throws Throwable {
  //...réduction
}

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.

S'applique aux méthodes de l'interface spécifiée ou de la classe d'implémentation de la classe abstraite.

OK


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

contraignant

Vous pouvez lier l'interface à un conseiller.

OK


@Around("target(service)")
public Object t2(ProceedingJoinPoint pjp, AbstractService service) throws Throwable {
  //...réduction
}

Étant donné que la source de données est également une interface, elle peut être appliquée aux méthodes de la source de données comme indiqué ci-dessous.

Exemple


@Around("target(datasource)")
public Object b1(ProceedingJoinPoint pjp, DataSource datasource) throws Throwable {
  //...réduction
}

@​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.

Je ne suis pas sûr. J'ai cherché, mais je n'ai pas compris.

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.

S'applique aux méthodes qui acceptent l'argument spécifié. Si vous définissez args seul, une erreur d'exécution se produira, nous réduisons donc la cible avec l'exécution.

Dans cet exemple, il est appliqué à une méthode qui prend une classe appelée WeatherForm comme argument.

OK


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

La séquence d'arguments spécifiée pour args est importante. Si vous voulez prendre un argument autre que WeatherForm, vous devez spécifier l'argument ou ajouter "..".

Exemple


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

contraignant

Vous pouvez lier les arguments au conseiller.

OK


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

@​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.

S'applique aux méthodes qui prennent un objet de la classe avec l'annotation spécifiée comme argument.

OK


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

Exemple


@AopTest
public class WeatherForm implements Serializable {
  //...réduction
}

Il ne peut pas être appliqué (il ne prend pas effet) en spécifiant une annotation dans l'argument de la méthode comme indiqué ci-dessous.

NG


public void forecast(@AopTest WeatherForm form) {
  //...réduction
}

contraignant

Vous pouvez lier des annotations aux conseillers.

OK


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

bean

Spécifiez par le nom du bean géré par le conteneur Spring. Vous pouvez utiliser des caractères génériques dans le nom. Cet exemple s'applique à une méthode bean se terminant par "ServiceImpl".

Exemple


@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.

S'applique à la méthode avec l'annotation spécifiée.

OK


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

Exemple


@AopTest
public void beforeTransaction() {
  //...réduction
}

contraignant

Vous pouvez lier des annotations aux conseillers.

OK


@Around("@annotation(aopTest)")
public Object a2(ProceedingJoinPoint pjp, AopTest aopTest) throws Throwable {
  //...réduction
}

Spécificateur de coupe de point non pris en charge

À partir de septembre 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

Comment écrire un spécificateur de coupe de point Spring AOP
Comment faire un test unitaire de Spring AOP
Comment écrire des rails
A propos de Spring AOP Pointcut
Comment écrire docker-compose
Comment écrire Mockito
Comment écrire un fichier de migration
Comment rédiger un commentaire java
[Refactoring] Comment écrire le routage
Introduction à Spring Boot ② ~ AOP ~
Comment écrire des graines de Rails
Comment écrire le routage Rails
Comment utiliser Lombok au printemps
Étudier Java # 6 (Comment écrire des blocs)
Remarques sur l'utilisation de Spring Data JDBC
[Comment installer Spring Data Jpa]
Comment configurer Spring Boot + PostgreSQL
[Rails] Comment écrire la gestion des exceptions?
Comment écrire une déclaration de variable Java
Comment utiliser ModelMapper (Spring boot)
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
Comment inclure Spring Tool dans Eclipse 4.6.3?
Résumé de l'écriture des arguments d'annotation
[Introduction à Java] Comment écrire un programme Java
[Java] Comment sortir et écrire des fichiers!
Pour écrire des données de réponse directement dans Spring
[Spring MVC] Comment transmettre des variables de chemin
Comment diviser un fichier de message Spring Boot
[SpringBoot] Comment écrire un test de contrôleur
Promesse JDBC et exemple d'écriture
Rails: comment bien écrire une tâche de râteau
[Java FX] Comment écrire des autorisations Eclipse dans build.gradle
[Rails] Comment écrire lors de la création d'une sous-requête
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment écrire une instruction if pour améliorer la lisibilité-java
Comprendre comment partager des connexions Spring DB (transactions DB)
Comment réduire l'image de Spring Boot Docker
À propos de Spring AOP
JUnit 5: Comment écrire des cas de test dans enum
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
À propos de Spring AOP
Exemple d'implémentation de F06 d'écriture en temps réel hors ligne
Comment écrire du code qui pense Ruby orienté objet
Comment écrire du code de test avec la certification de base
Comment se lier avec un fichier de propriétés dans Spring Boot
Comment écrire React Native Bridge ~ Version Android ~
Comment définir plusieurs orm.xml dans Spring4, JPA2.1