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.
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 |
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 |
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が付いているメソッドに適用 |
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.
AOP au printemps Interpréter grossièrement l'AOP utilisé au printemps Programmation orientée Spring Aspect Spring AOP - Blog Pape SE
Recommended Posts