[JAVA] Spring AOP pour la première fois

Cette fois, j'aimerais écrire sur Spring AOP. Si vous souhaitez connaître les spécifications détaillées, veuillez lire Référence officielle. La version est Spring Boot 2.0.1.RELEASE (Spring 5.0.5.RELEASE).

Qu'est-ce que l'AOP

AOP signifie ** Aspect Oriented Programming ** et est appelé "Aspect Oriented Programming". Dans AOP, écrivez du code pour séparer le traitement inter-classes (traitement des exceptions, journalisation, traitement des transactions, etc.) de la logique métier. Cela permet d'écrire simplement plusieurs processus et d'empêcher le code qui exécute le même processus d'être écrit à différents endroits.

Termes souvent utilisés dans Spring AOP

Aspect Aspect est un module qui définit le transversal et où le faire. Au printemps, en ajoutant @Aspect à une classe, cette classe sera reconnue comme Aspect. Vous devez définir Aspect comme un bean, alors n'oubliez pas de le déclarer comme un bean avec @Component. (@Service et @Repository où @Component est déclaré en interne sont également OK.)

@Component
@Aspect
public class HogeAspect{

}

JoinPoint JoinPoint fait référence à l'endroit (méthode) où le processus transversal est inséré. PointCut PointCut est une représentation d'une collection de JoinPoints. Express PointCut en tant que paramètre de l'annotation Advice (décrite plus loin) comme indiqué dans l'exemple de code ci-dessous. Dans l'exemple ci-dessous, JoinPoint est spécifié par execution ().

@After(value = "execution(* com.example.fuga..Fuga.*(..))")
public void Hoge(/* .. */){
  /* .. */
}
/*Au printemps, s'il n'y a pas d'autres paramètres, le paramètre nommé valeur "valeur"=Peut être omis, donc
@After("execution(* com.example.fuga..Fuga.*(..))")Vous pouvez également écrire.*/

Dans execution (), JoinPoint est exprimé par la syntaxe suivante.

execution(Valeur de retour Nom du package.nom de la classe.Nom de la méthode(Type d'argument))
/*
「*」 ->Représente une chaîne de caractères arbitraire. Cependant, lorsqu'il est utilisé comme nom de package, il représente "un package avec un nom arbitraire", et lorsqu'il est utilisé comme argument, il représente "un type arbitraire".
「..」 ->Lorsqu'il est utilisé comme nom de package, il représente "un package de 0 ou plus", et lorsqu'il est utilisé comme argument, il représente "tout type de 0 ou plus".
*/ 

Dans le premier exemple, il est exprimé que @After est appliqué à toutes les méthodes de la classe "Fuga" sous le package "com.example.fuga" (y compris les sous-packages) avec une valeur de retour arbitraire. Faire.

Outre l'exécution (), il existe diverses choses telles que within () et this (), mais execution () est souvent utilisée. Référence

Advice Le conseil représente le processus transversal lui-même exécuté par JoinPoint. En annotant une méthode d'une classe avec @Aspect, cette méthode peut être exécutée en tant que Advice. Il existe cinq types d'annotations qui représentent des conseils: @Before Conseil exécuté avant le traitement de la méthode cible.

@Before("execution(* *..*(..))")
public void beforeHandler(){
/* .. */
}

@After Conseil toujours exécuté quel que soit le résultat du traitement de la méthode cible.

@After("execution(* *..*(..))")
public void afterHandler(){
/* .. */
}

@AfterReturning Avis qui n'est exécuté que lorsque le traitement de la méthode cible est terminé avec succès. Si vous spécifiez une chaîne de caractères dans le paramètre de retour, la valeur de retour du traitement exécuté par JoinPoint est stockée dans la variable de cette chaîne de caractères. Cela permet à la valeur de retour d'être utilisée dans Advice.

@AfterReturning(value = "execution(* *..*(..))", returning = "r")
public void afterReturning(Object r){
  System.out.println(r);
}

@AfterThrowing Avis qui n'est exécuté que lorsqu'une exception se produit lors du traitement de la méthode cible. Si vous spécifiez une chaîne dans le paramètre throwing, la variable de cette chaîne stocke l'exception qui s'est produite dans le processus exécuté par JoinPoint. Cela permet d'utiliser des exceptions dans les conseils.

@AfterThrowing(value = "execution(* *..*(..))", throwing = "e")
public void afterThrowing(Throwable e){
  System.out.println(e.getMessage());
}

@Arround Conseils pouvant être exécutés à tout moment avant ou après le traitement de la méthode cible. Comme le montre l'exemple ci-dessous, le prétraitement et le post-traitement peuvent être définis librement.

@Arround("execution(* *..*(..))")
public void arround(ProceedingJoinPoint pjp) throws Throwable {
  System.out.println("Prétraitement")

  //Exécution de la méthode
  Object result = pjp.proceed();

  System.out.println("Post-traitement")
}

Comment utiliser

Ajouter une bibliothèque à pom.xml

Si vous utilisez Spring Boot, ajoutez "spring-boot-starter-aop" aux dépendances dans pom.xml. Si "spring-boot-starter-parent" est spécifié comme parent, il n'est pas nécessaire de spécifier la version de spring-boot-starter-aop car les informations de version ont déjà été définies.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

Si vous n'utilisez pas Spring Boot, vous pouvez l'utiliser en ajoutant «spring-aop» et «aspectjweaver» à pom.xml et en ajoutant @EnableAspectJAutoProxy à JavaConfig (opération non confirmée).

Créer un aspect

Créez une classe pour Aspect et préfixez la classe avec @Aspect et @Component.

@Component
@Aspect
public class HogeAspect{

}

Créer des conseils et rédiger PointCut

Créez une méthode dans la classe définie comme Aspect. Annotez de manière appropriée l'avis décrit ci-dessus en fonction du moment de l'exécution de l'avis. En outre, utilisez execution () pour décrire dans quelle classe ou méthode l'avis créé est appliqué dans l'annotation Avis.

@Component
@Aspect
public class HogeAspect{
  
  @AfterThrowing(value = "execution(* *..*(..))", throwing = "ex")
  public void handler(Throwable ex){
    /* .. */
  }
}

Dans l'exemple ci-dessus, la gestion des exceptions est définie pour les exceptions qui se produisent dans toutes les méthodes.

référence

https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#aop

Recommended Posts

Spring AOP pour la première fois
Spring Boot pour la première fois
Introduction à Java pour la première fois # 2
Murs touchés par le premier Rspec
J'ai essayé de toucher Docker pour la première fois
Apprentissage pour la première fois des expressions et opérateurs Java # 3
Essayez d'exécuter Spring Cloud Config pour le moment
Mémo d'apprentissage lors de l'apprentissage de Java pour la première fois (mémo d'apprentissage personnel)
Comment étudier le kotlin pour la première fois ~ Partie 2 ~
Comment étudier le kotlin pour la première fois ~ Partie 1 ~
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
Mémo après le premier projet Spring-MVC-
Mémo après le premier projet Spring-Database-
Modéliser Digimon avec DDD pour la première fois Partie 1
Réfléchissez lorsque Rails (turbolinks) ne charge pas la page pour la première fois
Mémo après le premier projet Spring-What is Spring-
Toucher Kotlin pour la première fois-Enum Classes
Utilisez la méthode l pour la notation temporelle
À propos de Spring AOP
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment
L'histoire de la sortie de l'application Android sur le Play Store pour la première fois.
À propos de Spring AOP
[Communication Socket (Java)] Impressions de la mise en œuvre de la communication Socket dans la pratique pour la première fois
Créer une application et la déployer pour la première fois avec heroku
Première programmation de ma vie Java 1st Hello World
Correspond aux annotations sur l'interface avec Spring AOP
Installez Amazon Corretto (préversion) pour le moment
Utilisez une bibliothèque Java externe pour le moment
Exécutez Dataflow, Java, Streaming pour le moment
L'histoire de l'utilisation intentionnelle de Try catch pour la première fois de ma vie
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
L'histoire d'un super débutant participant pour la première fois au concours AtCoder (AtCoder Beginner Contest 140)
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
Première botte à ressort (DI)
A propos de Spring AOP Pointcut
[Programmation complète] §1 Première programmation
[Premier message] Affiche le mot Épuisé pour les produits vendus
[Android studio / Java] Ce que vous ne comprenez pas lorsque vous le touchez pour la première fois
Commande pour essayer d'utiliser Docker pour le moment
Présentation de Spring AOP
Changez la cible d'injection pour chaque environnement avec Spring Boot 2
Hello World avec la bibliothèque d'extension Ruby pour le moment
La première application WEB avec Spring Boot-Making a Pomodoro timer-
Procédure de publication d'applications Android adaptée aux débutants, en difficulté pour la première version first
Avec le logiciel que je fais depuis longtemps ...
[DL4J] Premier apprentissage en profondeur Java (reconnaissance de caractères manuscrits à l'aide d'un réseau neuronal entièrement connecté)
[Java] Ordre d'exécution de Spring AOP
Créer un environnement Spring pour Android 2.0.0
A quoi sert le constructeur?
Essayez le tutoriel Spring WebFlux
Spring Boot pour l'apprentissage des annotations
Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
Ce que je pense maintenant, c'est qu'une personne inexpérimentée étudie la programmation pour la première fois depuis un mois.
Expérimentons le flux d'octroi de code d'autorisation avec Spring Security OAuth-Partie 2: Créer une application pour le moment
[Ruby on Rails] Lors de la première connexion ・ Comment diviser l'écran en deux à l'aide de jQuery