[JAVA] Introduction à Spring Boot ② ~ AOP ~

En savoir plus sur AOP en suivant la DI précédente Veuillez noter que le contenu sera super-introductif.

AOP(Aspect-Oriented Programming)

La programmation orientée aspect est l'un des concepts des méthodes de développement telles que la programmation orientée objet. Lors de l'écriture d'une méthode, le traitement qui n'est pas directement lié à ce que vous voulez faire, comme le traitement de journalisation et le traitement d'authentification, sera mélangé. Il s'agit d'une méthode de développement qui tente de séparer et de décrire de tels traitements auxiliaires (préoccupations). Par exemple, supposons que vous ayez la méthode suivante drinkAlcohol ().

➀ Journal de démarrage: je vais boire!
	↓
➁ Boire
	↓
➂ Journal de fin: je me suis saoulé!

Dans ce cas, ① et ③ sont des processus qui ne sont pas directement liés à l'acte de «boire», ils seront donc décrits séparément à différents endroits. Ensuite, définissez ① avant d'exécuter la méthode et ③ après l'exécution. Maintenant, la méthode drinkAlcohol () ne se soucie pas du processus de journalisation, concentrez-vous simplement sur ② le processus de "consommation".

L'idée de séparer et de modulariser les traitements auxiliaires de cette manière est appelée AOP. C'est vieux, mais [ici](http://netail.net/aosdwiki/index.php?%A5%A2%A5%B9%A5%DA%A5%AF%A5%C8%BB%D8%B8%FE L'explication de% A5% D7% A5% ED% A5% B0% A5% E9% A5% DF% A5% F3% A5% B0) était facile à comprendre.

Glossaire

le terme sens
Aspect Un résumé du comportement (des préoccupations) de traitement courant et des points à appliquer
=Un résumé des conseils et des points
Advice Comportement de traitement commun distinct
Le processus lui-même qui est réellement exécuté
JoinPoint Moment pour mettre des conseils
Avant ou après l'exécution d'une méthode, etc.
PointCut Conditions pour appliquer les conseils
Expression conditionnelle pour déterminer s'il faut exécuter le conseil lorsque JoinPoint est atteint

Annotation JoinPoint

Une annotation est fournie pour définir le moment de l'exécution des conseils.

Annotation Horaire
@Before Exécuté avant d'exécuter la méthode
@After Exécuté après l'exécution de la méthode
Le résultat de l'exécution n'a pas d'importance
@Around Exécuté à la place de la méthode.
Traitement avant et après la méthode
@AfterReturning Exécuté lorsque la méthode se termine normalement
@AfterThrowing Exécuté lorsqu'une exception se produit dans la méthode

Directive PointCut

Décrit l'expression conditionnelle qui exécute le conseil. Jetons un œil au format «exécution» couramment utilisé.

ʻExecution (valeur de retour du modificateur de méthode nom du package. nom de la classe. nom de la méthode (type d'argument) lance une exception) `

Les modificateurs de méthode et les exceptions de levée sont facultatifs.

@Before("execution(* com.sample..*(..))")

Dans l'exemple ci-dessus, il sera exécuté avant d'exécuter la méthode sous le package com.sample. Les caractères génériques peuvent être utilisés dans les expressions conditionnelles.

Caractère générique sens
* Au lieu de tout type, ou partie d'un nom de classe ou de package
.. Au lieu de tout argument, ou d'une partie du nom de la classe ou du package
+ Spécifiez toutes les sous-classes et implémentations d'interface en écrivant à droite du nom de la classe et du nom de l'interface

En plus de ʻexecution`, les directives suivantes sont disponibles.

Directive PointCut Condition d'exécution
within(nom de la classe) S'applique aux méthodes de la classe spécifiée
target(nom de la classe) S'applique aux méthodes des classes qui héritent de la classe spécifiée (s'applique aux classes parent et enfant)
args(Type d'argument) S'applique aux méthodes avec des arguments qui correspondent à l'argument spécifié
@annotation(Annotation) 指定したAnnotationが付いているメソッドに適用

Exemple de code

J'ai essayé de réaliser la méthode ci-dessus drinkAlcohol () avec AOP.

Drink.java


public class Drink {

	public void drinkAlcohol() {
		System.out.println("drinking...");
	}
}

N'écrivez pas le processus d'enregistrement, mais décrivez seulement (2) le processus de consommation d'alcool.

SampleAspect.java


@Aspect
@Component
public class SampleAspect {
	
	@Before("execution(* com.sample..*(..))")
	public void beforeDrinking() {
		System.out.println("[@Before]start drinking alcohol!");
	}

	@After("execution(* com.sample..*(..))")
	public void afterDrinking() {
		System.out.println("[@After]I got drunk...zzZ");
	}
}

Ajoutez des annotations @Aspect et @Component à la classe. @Before est (1) journal de début et @After est (3) journal de fin.

Le résultat de l'exécution est le suivant.

[@Before]start drinking alcohol!
drinking...
[@After]I got drunk...zzZ

Les journaux sont générés correctement avant et après la méthode.

@Around

Maintenant, réalisons le même processus avec @Around.

SampleAspect.java


@Aspect
@Component
public class SampleAspect {
	
	@Around("execution(* com.sample..*(..))")
	public void aroundDrinking(ProceedingJoinPoint pjp) {
		System.out.println("[@Around]start drinking alcohol!");	//Tous les traitements (➀ démarrer le journal)
		try {
			pjp.proceed(); //Appelez la méthode (➁ drinkAlcohol())
		} catch (Throwable e) {
			e.printStackTrace();
		}
		System.out.println("[@Around]I got drunk...zzZ"); //Post-traitement (➂ journal de fin)
	}
}

@Around exécutera le conseil Around au lieu de la méthode cible. Vous pouvez appeler la méthode avec ProceedingJoinPoint.proceed (), donc cela ressemble à mettre le traitement de la journalisation avant et après cela.

Matériel de référence

AOP au printemps Interpréter grossièrement l'AOP utilisé au printemps Programmation orientée Spring Aspect Spring AOP - Blog Pape SE

Recommended Posts

Introduction à Spring Boot ② ~ AOP ~
Introduction à Spring Boot ① ~ DI ~
Introduction à Spring Boot, partie 1
[Introduction à Spring Boot] Vérification de la validation du formulaire
Introduction à Spring Boot + In-Memory Data Grid
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Essayez Spring Boot de 0 à 100.
Introduction à Ratpack (7) --Guice & Spring
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Comment faire un test unitaire de Spring AOP
Comment configurer Spring Boot + PostgreSQL
Comment utiliser ModelMapper (Spring boot)
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Introduction à Ruby 2
Introduction à Spring Boot x Open API ~ Open API créée avec le modèle d'écart de génération ~
Spring Fox ① Introduction
À propos de Spring AOP
Défi Spring Boot
L'histoire de la transition de Spring Boot 1.5 à 2.1
À propos de Spring AOP
Introduction à web3j
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Forme de botte de printemps
Introduction à Java
Spring Boot Rappelez-vous
gae + botte à ressort
Comment écrire un spécificateur de coupe de point Spring AOP
Introduction à Doma
Comment diviser un fichier de message Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
Introduction du livre: Spring Boot Livre de référence recommandé pour les débutants!
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Comment réduire l'image de Spring Boot Docker
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Comment ajouter un chemin de classe dans Spring Boot
Comment se lier avec un fichier de propriétés dans Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
[Spring Boot] Comment se référer au fichier de propriétés
Spring Boot - Comment définir le délai d'expiration de la session
Fiche d'apprentissage SPRING BOOT 01
Introduction aux fichiers JAR
Botte de printemps + Heroku Postgres
Introduction à Ratpack (8) - Session
Rédaction de mémo de démarrage de printemps (1)
Introduction à l'arithmétique des bits
Introduction à Ratpack (6) - Promesse
Première botte à ressort (DI)
Aide-mémoire Spring Boot2
Introduction à PlayFramework 2.7 ① Présentation