[JAVA] Je veux passer l'argument d'Annotation et l'argument de la méthode d'appel à aspect

introduction

Ceci est une histoire sur AOP de Java Spring Framework.

Utilisation de @Aspect

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.

Confirmation des conditions

  1. «Aspect» Le module lui-même qui montre des intérêts transversaux.
  2. 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).
  3. Code ʻAdvice` qui s'exécute à un JoinPoint spécifique, la mise en œuvre de préoccupations transversales. «@ Around» est très polyvalent, mais si vous souhaitez limiter le timing, tel que le traitement que vous souhaitez effectuer uniquement lorsque le traitement de la méthode cible est réussi, vous devez utiliser des conseils adaptés à votre objectif.
@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
  1. 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/de1019aeaaab51c8784d

Exemple concret

Contrôleur utilisant Aspect

MyController.java


@Controller
@RequestMapping("/hogehoge")
public class MyController {

    @GetMapping
    @MyAnnotation(hoge = "test", piyo = false)
    public String doGet(HttpServletRequest req, HttpServletResponse res) {
        //~ Traitement ~
        return "hogehoge";
    }
}

Définition de l'annotation

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();
}

Aspect qui reçoit la définition de l'annotation comme argument

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
    }
}

Résumé

Si vous souhaitez obtenir les arguments de la méthode appelante
    protected HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest()
                .getParameter("hoge");
    }

Recommended Posts

Je veux passer l'argument d'Annotation et l'argument de la méthode d'appel à aspect
Je veux appeler une méthode et compter le nombre
Je veux var_dump le contenu de l'intention
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
Je veux appeler une méthode d'une autre classe
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je veux appeler la méthode principale en utilisant la réflexion
[Commentaire approximatif] Je veux épouser la méthode du pluck
Je veux retourner la position de défilement de UITableView!
Passez un argument à la méthode et recevez le résultat de l'opération comme valeur de retour
J'ai essayé de résumer les bases de kotlin et java
Je veux amener Tomcat sur le serveur et démarrer l'application
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Je souhaite renvoyer plusieurs valeurs de retour pour l'argument saisi
[Ruby] Je souhaite inverser l'ordre de la table de hachage
Je veux passer la commande de démarrage à postgres avec docker-compose.
J'ai essayé d'expliquer la méthode
Je veux obtenir une liste du contenu d'un fichier zip et sa taille non compressée
Je veux comprendre le flux des paramètres de demande de traitement Spring
Je veux revenir à l'écran précédent avec kotlin et java!
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Méthode pour additionner le nombre d'années et obtenir la fin du mois
Je veux limiter l'entrée en réduisant la plage de nombres
J'ai essayé de résumer les méthodes de Java String et StringBuilder
Je veux contrôler le message d'erreur par défaut de Spring Boot
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot
Je voulais ajouter @VisibleForTesting à la méthode
J'étais accro à la méthode du rouleau
Je veux afficher des images avec REST Controller de Java et Spring!
Je veux connaître le JSP du portlet ouvert lors du développement de Liferay
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
[Administrateur actif] Je souhaite personnaliser le traitement de création et de mise à jour par défaut
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
Je veux obtenir la valeur de Cell de manière transparente quel que soit CellType (Apache POI)
J'ai comparé les caractéristiques de Java et .NET
[Ruby] Je veux faire un saut de méthode!
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Sortie de la façon d'utiliser la méthode slice
[Rubiy] Je veux créer un tableau à partir d'une chaîne de caractères avec la méthode split. Et vice versa.
Je veux tronquer après la virgule décimale
Je veux voir le contenu de Request sans dire quatre ou cinq
Lors de la réaffectation à un argument dans une méthode Ruby puis en appelant `super` → Celui réaffecté est utilisé
[JDBC ③] J'ai essayé d'entrer à partir de la méthode principale en utilisant des espaces réservés et des arguments.
Je veux obtenir la valeur en Ruby
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
L'argument de link_to est nul (nul) et un lien inattendu a été généré, j'ai donc essayé de le vérifier