AOP Je pense que tout le monde est très clair. Parfois, nous devons traiter certains journaux de demande, ou surveiller certaines méthodes, et que devrait être géré s'il existe des exceptions? Maintenant, nous introduisons AOP de Spring-Boot.
[Environnement de développement: le numéro de version JDK est de 1,8, printemps
Le numéro de version du démarrage est 1.4.1] {style = ”background-Color: # ff0000”}
Tout d'abord, nous présenterons d'abord le package JAR.
Le fichier POM est ajouté comme suit:
<! - Cite AOP -> <dependency> <proupId> org.springframework.boot </proupId> <Artifactid> printemps-boot-starter-aop </ artifactid> </pedidency> <! - Cite gson, for Printing -> <Dedency> <proupId> com.gonlid> <version> 2.7 </ version> </ dépendance>
Après avoir introduit le package JAR, nous ajoutons deux méthodes de traitement de demande simples pour démarrer le démarrage:
@SpringbootApplication (ScanBasePackages = {"Com"}) @ RestControllerPublic class DemoApplication {public static void main (String [] args) {SpringApplication.Run (DemoApplication.Class, Args); } // Testez une demande GET sans arguments @RequestMapping (value = "/ testaspect", méthode = requestMethod.get) public userVo test () {userVo userVo = new userVo (); userVo.Setage ("23"); uservo.setName ("He xiaowu"); uservo.setSex ("mâle"); retourner userVo; } // Testez la demande GET avec des paramètres, laissez AOP imprimer le contenu du paramètre @RequestMapping (value = "/ testAspectArgs", méthode = requestMethod.get) public userVo test (nom de chaîne, agent de chaîne, sex-sex) {userVo userVo = new uservo (); uservo.setName (nom); userVo.Setage (âge); uservo.setSex (sexe); retourner userVo; }Après avoir ajouté deux méthodes de traitement des demandes simples, ajoutons notre AOP
/ ** * Nom du projet: SpringbootDemo * Créateur: He xiaowu * Temps de création: 16/12/4 7:05 PM * Nom de la classe: AspectDemo * Classe Description: * /// Declare est une section @ aspect // Declare est un Logger GEAGE Spring @ composant @ commander (1) public class AspectDemo {private Logger Log = Logger.getLogger (GetClass (GetClass); privé gson gson = new gson (); // Déclare un point dans l'expression d'exécution @pointcut ("EXECUTION (public * com.example.demoapplication. * (..))") private void ControlleraSpect () {} // imprime le contenu avant de demander la méthode @Before (value = "ControlleraSpect ()") public void MethodBefore (joinpoint) {SERVLETREQUESTATATTRIBUtes (ServletRequestAttributes) requestContexTholder.getRequestAttributes (); HttpServLetRequest request = requestAttributes.getRequest (); // imprime le contenu de la demande Log.info ("============================================================================================= ========================================================================. ========================================================================. ==========================================================================. ========================================================================. ==========================================================================. ========================================================================. ==========================================================================. // Imprime le contenu de retour une fois la méthode exécutée @Afterreturning (returning = "o", pointCut = "ControlleraSpect ()") public void methodafterreturning (objet o) { Log.info ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Une fois les deux configurés, nous demandons puis affichons le journal d'impression. Tout d'abord, démarrez notre conteneur, puis nous demandons d'abord la méthode de traitement paramétrée. Le journal d'impression est le suivant:
{width = ”1232”
height = ”132”}
On peut constater que l'URL, la méthode, les valeurs des paramètres Args demandées, les types et le contenu renvoyé sont tous imprimés, ce qui indique qu'il s'agit de l'interception AOP avec succès.
Ensuite, nous testons la méthode de traitement de la demande sans paramètres et imprimons le journal comme suit:
{width = ”1100”
height = ”130”}
Nous pouvons constater que les paramètres de méthode imprimés dans cette méthode sont un tableau vide car la méthode ne nécessite pas de passage de paramètres.
Ce qui précède est Springboot références AOP pour le traitement du journal du traitement Web. Voici quelques annotations principales pour les sections AOP. Voici les descriptions et l'utilisation des annotations. L'auteur ne les testera pas en détail. Si vous êtes intéressé, vous pouvez les tester vous-même:
Annotation de classe:
@Aspect définit une classe comme une classe d'aspect
@Order (i) marque la priorité de traitement de la classe Facet. Plus la valeur I est petite, plus le niveau de priorité est élevé. PS: vous pouvez annoter la classe ou annoter la méthode.
Annotation de la méthode:
@Pointcut définit une méthode comme une coupe ponctuelle comme une expression, les détails suivants
@BeFore exécute la méthode avant le point tangent, le contenu est le point tangent spécifié
@After exécute après la coupe de points, avant le retour,
@Afterreturning est exécuté après le point d'entrée et le retour. Si vous souhaitez traiter les paramètres de retour de certaines méthodes, vous pouvez le faire fonctionner ici.
@Around entoure le point tangent, exécutez avant d'entrer dans le point tangent, et après le point tangent
@AfterThrowing lance une exception après la fente pour le traitement
@Order (i) marque la priorité de la coupe ponctuelle. Plus le I est petit, plus la priorité est élevée
@Pointcut Annotation Combinaison:
Dans le code ci-dessus, nous définissons un point tangent qui ne traite que le chemin spécifié:
@Pointcut ("EXECUTION (public * com.example.demoapplication. * (..))") private void ControlleraSpect () {}Maintenant, nous définissons un point tangent pour gérer d'autres chemins:
@Pointcut ("EXECUTION (public * com.demo. *. * (..))") private void ControllerDemo () {}Les points tangents ci-dessus sont tous traités séparément. Si nous avons besoin d'un point tangent pour les traiter tous les deux, nous pouvons le configurer comme ceci:
@Pointcut (value = "ControlleraSpect () || ControllerDemo ()") private void all () {} Dans l'annotation @PointCut, se référer directement à d'autres noms de méthode annotés par @PointCut, afin que la coupe de points puisse gérer les méthodes sous deux chemins
Expression de l'exécution de l'annotation @pointcut: public * com.demo. *. * (..)
Le premier modificateur public représentant la méthode peut utiliser * au lieu du premier * pour représenter la valeur de retour, et * représente tout
com.demo. * Le chemin du package,. * Représente le troisième package dans le chemin. * Représente les méthodes de toutes les classes sous tous les packages sous le chemin.
(..) signifie des paramètres de méthode illimités
Quelques notes sur @Order (i) Annotation:
Plus la classe d'annotation, plus la valeur est petite, plus la priorité est élevée, la méthode d'annotation, plus les deux annotations sont annotées: @Before, plus la valeur I est petite, plus la priorité est élevée, plus la priorité est élevée, plus la priorité est élevée.
Pour résumer les deux, c'est:
Dans l'opération avant le point d'entrée, l'opération après le point d'entrée est effectuée par la valeur de commande de petite à grande, et l'opération après le point d'entrée est effectuée par la valeur de commande de grande à petite
étendre:
Certains lecteurs peuvent demander, si je souhaite imprimer l'heure requise pour la demande de l'accès entrant et de la fin, définissez une variable de membre pour compter l'heure et accorder @Before et @Afterreturning Access, il peut y avoir des problèmes de synchronisation. Nous nous référons donc à un objet threadlocal qui spécifie le type générique. Le temps d'enregistrement de la demande dans @Before et de déduire le dossier dans @Afterreturning est le temps consommé. Le code est le suivant:
/ ** * Nom du projet: SpringbootDemo * Créateur: He xiaowu * Temps de création: 16/12/4 7:05 PM * Nom de la classe: AspectDemo * Classe Description: * /// Déclaration est une section @ Aspect // Déclaration est un logger Généré Spring. privé gson gson = new gson (); ThreadLocal <long> startTime = new ThreadLocal <long> (); // Déclare un point dans l'expression d'exécution @pointcut ("EXECUTION (public * com.example.demoapplication. * (..))") private void ControlleraSpect () {} // imprime le contenu avant de demander la méthode @Before (valeur = "ControlleraSpect ()") public void MethodBefore (joinpoint) {starttime.set (System.CurrenttimeMILS (); ServletRequestAttributes requestAttributes = (servLetRequestAtTributes) requestContexTholder.getRequestAttributes (); HttpServLetRequest request = requestAttributes.getRequest (); // imprime le contenu de la demande Log.info ("===========================================================================================================================================================================================================. =====================================================================================================================================. =====================================================================================================================================. =====================================================================. =====================================================================. Arrays.tostring (joinpoint.getargs ())); log.info("========================================================================================================== Arrays.tostring (joinpoint.getargs ())); log.info ("Contenu de réponse:" + gson.tojson (o)); Log.info ("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Ce qui précède sont tous les résultats obtenus par mon test. Il peut y avoir des différences ou des erreurs. Veuillez me corriger.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.