Avant de lire cet article, vous pouvez vous référer à l'article " Une compréhension simple de l'IOC et des exemples AOP et de code de Spring " pour comprendre brièvement le contenu pertinent de l'IOC et de l'AOP. Passons au sujet.
Cet article créera l'exemple le plus simple étape par étape pour utiliser les fonctionnalités AOP de Spring, qui est considérée comme une démo débutant de Spring AOP. En tant que débutant, la gestion d'une démonstration aussi simple a également été frappée par de nombreux pièges.
Problème d'OOP, complémentaire à AOP
Lorsque nous devons introduire le comportement public aux objets dispersés, la POO semble impuissante. Autrement dit, la POO vous permet de définir des relations de haut en bas, mais ne convient pas pour définir des relations de gauche à droite. Par exemple, fonction de journalisation. Le code journal est souvent dispersé horizontalement à tous les niveaux d'objets sans aucun rapport avec la fonctionnalité principale de l'objet auquel il est dispersé. Il en va de même pour d'autres types de code, tels que la sécurité, la gestion des exceptions et la transparence. Ce type de code non pertinent dispersé partout est appelé code transversal. Dans la conception OOP, il provoque beaucoup de duplication de code, ce qui n'est pas propice à la réutilisation de chaque module.
Le soi-disant «aspect», simplement en place, résume la logique ou les responsabilités qui ne sont pas liés à l'entreprise mais qui sont appelées conjointement par le module commercial, ce qui facilite la réduction de la duplication du code par le système, la réduction du couplage entre les modules et la promotion de l'opérabilité et de la maintenabilité futures.
Prise en charge de AOP au printemps
L'agent AOP du printemps est responsable de la génération et de la gestion des conteneurs IOC de Spring, et ses dépendances sont également gérées par les conteneurs du CIO. Par conséquent, le proxy AOP peut cibler directement d'autres instances de haricots dans le conteneur, et cette relation peut être fournie par injection de dépendance du conteneur IOC. Spring utilise Java Dynamic Proxy pour créer un proxy AOP par défaut, afin qu'il puisse créer un proxy pour n'importe quelle instance d'interface. Lorsque la classe qui a besoin d'un proxy n'est pas une interface proxy, Spring passera automatiquement à l'utilisation du proxy CGLIB et peut également forcer CGLIB.
La logique de cet exemple est la suivante: il y a une classe de voiture (classe affaires). Avant et après la méthode GO dans la classe de voiture, il y aura des enregistrements de journal correspondants, mais la classe de voiture elle-même ne connaît aucune logique du journal.
Créer un projet Maven et ajouter des dépendances
Tout d'abord, créez un nouveau projet Maven, utilisez le modèle MavenarcheTyPeQuequICKStart, puis ouvrez le fichier pom.xml et ajoutez les packages de dépendance requis pour que Spring AOP s'exécute.
<Dedency> <ProupId> org.springFramework </rompuprid> <ErtingActid> Spring-core </ artifactId> <DERVIÈRE> 4.0.5.release </DERNIERDS> </DENDENCENCE> <Dependency> <GroupId> Org.SpringFramework </proupId> <Artifactid> Spring-Beans </letifactid> <version> 4.0.5.release </ version> </ dépendance> <dependency> <proupId> org.springframework </proncId> <ArtifActid> printemps-context </ artifactive> <prider> 4.0.5.release </ version> </dependency> <dedidency> <proupId> org.springframework </prouvend> <version> 4.0.5.release </ version> </ dépendance> <dependency> <proupId> org.springframework </rom grouped> <lelease </ version> </pedidency> <petifactid> <groupId> org.Aspectj </prounid> <artifactid> <version> 1.8.1 </ version> </ dépendance>
Rédaction du code commercial
Ajout d'une voiture de classe affaires, y compris une méthode go ()
package com.wowo.spring_aop_demo1; public class car {public void go () {System.out.println ("Go Go Go!"); }}Écrire des facettes
La classe de journal enregistrera le fonctionnement du système, mais la logique du journal ne sera pas écrite partout dans la classe affaires, mais existe en classe de facettes.
package com.wowo.spring_aop_demo1; public class carlogger {public void beForère () {System.out.println ("La voiture va exécuter"); } public void AfterRun () {System.out.println ("La voiture est en cours d'exécution"); }}Cette classe d'aspect contient deux méthodes, à savoir la pré-notification et la post-notification.
Configurer les associations via des haricots
Ajout d'un nouveau fichier de configuration, nommé bean.xml dans cet exemple, pour associer le visage et les notifications dans le fichier de configuration
<? xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xmlns: aop/schema/aop " xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <Ebrot id = "logger" /> <aop: config> <aop: aspect ref = "logger"> <aop: Pointcut expression = "EXECUTION (* com.wowo.spring_aop_demo1.car.go (..))" id = "go" /> <aop: avant PointCut-ref = "go" Method = "Afterrun" /> </aop: aspect> </aop: config> </bans>
Remarque: Dans ce fichier de configuration, l'espace de noms d'AOP et plusieurs adresses contenues dans XSI: Schemalocation sont nécessaires.
Exécution (* com.wowo.spring_aop_demo1.car.go (..)) est une expression ponctuelle aspectj. L'exécution signifie le déclenchement pendant l'exécution. Le suivant * représente la valeur de retour de tout type. com.wowo.spring_aop_demo1.car fait référence à la classe où se trouve la coupe ponctuelle. Go (..) est le nom de la méthode, et ... représente n'importe quel paramètre.
Il existe 5 types de notifications qui peuvent être appliquées aux sections de ressort:
・Avant - L'appel est appelée avant que la méthode ne soit appelée
・Après - une notification est appelée une fois la méthode terminée, que la méthode soit exécutée avec succès.
・After-Retourning - L'appel est appelé après que la méthode a été exécutée avec succès
・After-wring - Appelez la notification après que la méthode lance une exception
・Autour - La notification emballe la méthode notifiée et effectue un comportement personnalisé avant et après l'appel de méthode notifiée.
Exécuter le code commercial
Vous trouverez ci-dessous une classe contenant la méthode principale () pour exécuter le code commercial
package com.wowo.spring_aop_demo1; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationcontext; public class app {public static void main (string [] args) {applicationContext = newn classpathxmlAPTICATIONCONCTION (""); "); Car car = (voiture) context.getBean ("Car"); cargaison(); }}Dans le code ci-dessus, un objet de voiture est créé par Spring. Lorsque le printemps crée cet objet, il constate que l'une de ses méthodes est configurée en tant que Pointcut. Par conséquent, lors de l'instanciation de l'objet, un objet proxy sera créé. Lorsque la méthode de point de point GO () est exécutée, elle sera interceptée par l'objet proxy créé par Spring. Avant d'exécuter la méthode GO, il appellera le pré-processus correspondant correspondant à processeur de Carlogger BeforRen (), puis appelez la méthode car.go.go (), puis appelez le post-processus de la classe de coupe section Carlogger Afterrun ().
Remarque: le ressort doit être utilisé pour créer un objet contenant des tangents. Si vous le créez vous-même, Spring ne peut pas le surveiller et son fonctionnement ne sera pas informé en appliquant une application.
Le résultat de sortie du projet est
La voiture va à Rungo Go GO! La voiture fonctionne
Utiliser les notifications surround
Si vous souhaitez utiliser les notifications surround, nous devons modifier les méthodes de notification et les fichiers de configuration dans la classe Aspect. La classe affaires n'a pas besoin de modifier les modifications car elles sont complètement découplées. Modifiez d'abord la classe de section Carlogger
import org.aspectj.lang.proceedingjoinpoint; public class carlogger {public void autour de la gueule (procédingjoinpoint joinpoint) {System.out.println ("la voiture va exécuter"); essayez {// appelant la méthode cible de l'objet proxy, dans cet exemple pointant vers la méthode car.go () joinpoint.proceed (); } catch (throwable e) {e.printStackTrace (); } System.out.println ("La voiture est en cours d'exécution"); }}La méthode entourant la notification doit accepter les paramètres de type procédure de type, et sa méthode process () appellera la méthode cible de l'objet proxy, donc dans des circonstances normales, cette méthode doit être appelée. Nous pouvons également organiser l'exécution de l'objet proxy en n'appelant pas cette méthode.
Ensuite, modifiez la partie AOP: configuration du fichier de configuration à ce qui suit
<aop: config> <aop: aspect ref = "Logger"> <aop: Pointcut expression = "Execution (* com.wowo.spring_aop_demo1.car.go (..))" id = "go" /> <aop: autour de la méthode = "autour
Remarque: les notifications surround ne peuvent pas exister en même temps que les notifications avant / arrière. Après avoir exécuté le code, le résultat de sortie reste inchangé.
Résumer
Ce qui précède est tout le contenu partagé par cet article sur la démo d'introduction à Spring AOP, j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!