[JAVA] À propos de Spring AOP

Un mémorandum personnel sur Spring AOP. Si vous faites une erreur, je vous serais reconnaissant de bien vouloir commenter.

référence

[Présentation détaillée de Spring](https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Spring-Framework%E3% 81% AB% E3% 82% 88% E3% 82% 8BJava% E3% 82% A2% E3% 83% 97% E3% 83% AA% E3% 82% B1% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E9% 96% 8B% E7% 99% BA-% E6% A0% AA% E5% BC% 8F% E4% BC% 9A% E7% A4% BENTT % E3% 83% 87% E3% 83% BC% E3% 82% BF / dp / 4798142476 / ref = sr_1_3? __Mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & keywords = printemps & qid = 1566716142 & s = passerelle & sr = 8-3) Spring AOP Pour JoinPoint (minutage avant ou après l'exécution de la méthode spécifiée), vous pouvez insérer le processus implémenté dans la classe avec l'annotation @Aspect.

Annotations d'avis disponibles

Annotation La description
@Before Le traitement est inséré avant d'exécuter la méthode cible.
@AfterReturning Le traitement est inséré après la fin normale de la méthode cible. Vous pouvez également obtenir la valeur de retour de la méthode au moment de l'arrêt normal.
@AfterThrowing La méthode cible se termine anormalement(Lorsqu'une exception est levée)Le traitement est inséré dans. Vous pouvez également obtenir une exception au moment d'une résiliation anormale.
@After Le traitement est inséré à la fin, que la méthode cible se termine normalement ou lève une exception.
@Around Le meilleur conseil. Le traitement est inséré avant et après la méthode cible.

la mise en oeuvre

Before

SampleAspect.java


package com.example.demo;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SampleAspect {
    @Before("execution(public * com.example.demo.controller.*.*(..))")
    public void startLog(JoinPoint jp) {
        System.out.println("Début de la méthode:" + jp.getSignature());
    }
}

After Returning

SampleAspect.java


package com.example.demo;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import com.example.demo.controller.resorces.UserResponse;

@Aspect
@Component
public class SampleAspect {
    @AfterReturning(value = "execution(public * com.example.demo.controller.*.*(..))", returning = "user")
    public void endLog(JoinPoint jp, UserResponse user) {
        System.out.println("Méthode d'arrêt réussie:" + jp.getSignature());
        System.out.println("Valeur de retour:" + user);
    }
}

After Throwing

SampleAspect.java


package com.example.demo;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SampleAspect {
    @AfterThrowing(value = "execution(public * com.example.demo.controller.*.*(..))", throwing = "e")
    public void endLog(JoinPoint jp, RuntimeException e) {
        System.out.println("Méthode abend:" + jp.getSignature());
        e.printStackTrace();
    }
}

After

SampleAspect.java


package com.example.demo;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SampleAspect {
    @After("execution(public * com.example.demo.controller.*.*(..))")
    public void endLog(JoinPoint jp) {
        System.out.println("Fin de la méthode:" + jp.getSignature());
    }
}

Around

SampleAspect.java


package com.example.demo;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SampleAspect {
    @Around("execution(public * com.example.demo.controller.*.*(..))")
    public Object log(ProceedingJoinPoint jp) throws Throwable {
        System.out.println("Début de la méthode:" + jp.getSignature());
        Object result;

        try {
            //Exécution de la méthode cible
            result = jp.proceed();
            System.out.println("Fin de la méthode:" + jp.getSignature());
            System.out.println("Valeur de retour:" + result);
            return result;
        } catch (Throwable e) {
            System.out.println("Méthode abend:" + jp.getSignature());
            e.printStackTrace();
            throw e;
        }
    }
}

Pointcut

Pointcut nommé

Vous pouvez également nommer le point de coupe et le réutiliser.

SampleAspect.java


package com.example.demo;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SampleAspect {
    @Pointcut("execution(public * com.example.demo.controller.*.*(..))")
    public void demoController() {}

    @Before("demoController()")
    public void startLog(JoinPoint jp) {
        System.out.println("Début de la méthode:" + jp.getSignature());
    }
}

Recommended Posts

À propos de Spring AOP
À propos de Spring AOP
A propos de Spring AOP Pointcut
À propos du printemps ③
A propos de la liaison de l'annotation Spring AOP
À propos de l'authentification Spring Security
À propos de DI of Spring ①
Présentation de Spring AOP
[Notes personnelles] À propos du framework Spring
À propos de l'erreur de contexte Spring Framework
Introduction à Spring Boot ② ~ AOP ~
[Java] Ordre d'exécution de Spring AOP
À propos =
À propos des annotations liées à Spring DI
Une histoire sur une BeanNotOfRequiredTypeException qui s'est produite après l'application d'AOP au printemps
Comment faire un test unitaire de Spring AOP
cadre de printemps Mémo d'étude simple (2): AOP
Spring AOP pour la première fois
À propos des erreurs lors de la mise en œuvre de la validation du printemps
À propos de method.invoke
À propos de Kotlin
À propos de attr_accessor
À propos de Hinemos
Journal système de sortie par la technologie Spring AOP
À propos de l'héritage
printemps × docker
À propos de Docker
Injection de dépendances Spring à l'aide de Java, Kotlin
javascript AOP
À propos du polymorphisme
À propos facultatif
À propos du hachage
À propos de JitPack
À propos de ça ()
À propos de l'affichage initial de Spring Framework
À propos de l'encapsulation
À propos de JAVA_HOME
À propos de statique
À propos des exceptions
Spring Java
Comment écrire un spécificateur de coupe de point Spring AOP
À propos de la portée
[Maven] À propos de Maven
À propos de la conception de Spring Boot et de l'environnement de test unitaire
Résumé de ce que j'ai appris sur Spring Boot
À propos du guide de démarrage officiel de Spring Framework
Correspond aux annotations sur l'interface avec Spring AOP
Spring Boot + Spring Data JPA À propos des jointures de table multiples