Ceci est une histoire sur AOP de Java Spring Framework.
Par exemple, il y a 100 classes qui veulent utiliser une certaine classe de service, et cela peut être réalisé en ajoutant @ Autowired
à chaque fois et DI, mais ce n'est pas très intelligent.
Par conséquent, améliorons la visibilité du code source en définissant le processus (classe avec l'annotation @ Aspect
) que vous souhaitez effectuer à divers endroits et en insérant le processus en ajoutant une annotation à la méthode de la classe que vous souhaitez utiliser. Tel est le but.
Join Point
Un point qui exécute une préoccupation transversale (au moment de l'exécution de la méthode ou du lancement d'exception).@Avant le traitement avant le traitement de la méthode cible
@AfterReturning Traité lorsque la méthode cible est traitée avec succès
@AfterThrowing Traité lorsqu'une exception est levée dans le traitement de la méthode cible
@Après: traité lorsque le processus est terminé, quel que soit le succès ou l'échec du processus de la méthode cible
@Autour Exécuté avant et après le traitement de la méthode cible
pointcut
Une expression qui sélectionne le JoinPoint à exécuter. Vous pouvez affiner le calendrier d'exécution en détail en spécifiant les conditions. Je n'y toucherai pas cette fois. Ce qui suit sera utile.
https://qiita.com/rubytomato@github/items/de1019aeaaab51c8784dMyController.java
@Controller
@RequestMapping("/hogehoge")
public class MyController {
@GetMapping
@MyAnnotation(hoge = "test", piyo = false)
public String doGet(HttpServletRequest req, HttpServletResponse res) {
//~ Traitement ~
return "hogehoge";
}
}
Cette zone a été utile. https://itsakura.com/java-annotation-make Le type primitif, la chaîne, la classe, le type d'énumération, l'annotation et seul un tableau à une dimension de ceux-ci peuvent être spécifiés comme arguments. https://www.ne.jp/asahi/hishidama/home/tech/java/annotation.html
MyAnnotation.java
//La portée de l'annotation.
@Retention(RetentionPolicy.RUNTIME)
//Cible à laquelle vous souhaitez donner une annotation.
@Target(ElementType.METHOD)
public @interface MyAnnotation {
/**Chaîne*/
String hoge();
/** boolean */
boolean piyo();
}
MyAspect.java
@Aspect
@Component
public class MyAspect {
@AfterReturning("@annotation(myAnnotation)")
public void after(JoinPoint jp, MyAnnotation myAnnotation) throws Throwable {
//Essayez de recevoir l'argument de l'appelant
//Ici, vous pouvez obtenir les requêtes HttpServletRequest et HttpServletResponse de l'appelant.
Object[] o = jp.getArgs();
//Peut accepter des arguments d'annotation
String hoge = myAnnotation.hoge();
System.out.println(hoge); // test
boolean piyo = myAnnotation.piyo();
System.out.println(piyo); // false
}
}
protected HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest()
.getParameter("hoge");
}
@AfterReturning (" @ annotation (jp.ne.example.MyAnnotation) ")
(décrire le chemin complet de la classe d'annotation)Recommended Posts