web-dev-qa-db-fra.com

Printemps AOP vs AspectJ

J'ai l'impression que Spring AOP convient mieux à des tâches spécifiques à une application, telles que la sécurité, la journalisation, les transactions, etc., car il utilise des annotations Java5 personnalisées comme infrastructure. Cependant, AspectJ semble être plus sage. 

Quelqu'un peut-il souligner les différents avantages et inconvénients de l'utilisation de Spring AOP vs AspectJ dans une application Spring?

156
zotherstupidguy

Spring-AOP

  • Il est plus simple à utiliser que AspectJ, puisqu'il n'est pas nécessaire d'utiliser LTW ( load-time-weaving ) ou le compilateur AspectJ.

  • Il utilise le modèle de proxy et le modèle de décorateur

Printemps-AOP Contre

  • Il s'agit d'une AOP basée sur un proxy, vous pouvez donc utiliser uniquement des points de jonction avec l'exécution de méthodes.
  • Les aspects ne sont pas appliqués lors de l'appel d'une autre méthode de la même classe.
  • Il peut y avoir un peu de temps d’exécution.
  • Spring-AOP ne peut pas ajouter d’aspect à un élément créé par Spring Factory.

AspectJ Pros

  • Cela prend en charge tous les points de ralliement. Cela signifie que vous pouvez faire n'importe quoi. 
  • Il existe moins de temps système d’exécution que celui de Spring AOP.

AspectJ Moins

  • Faites attention. Vérifiez si vos aspects sont tissés uniquement pour ce que vous vouliez tisser.
  • Vous avez besoin de processus de construction supplémentaires avec AspectJ Compiler ou de configurer LTW (tissage au moment du chargement)
208
Whiteship

En dehors de ce que d’autres ont dit - pour reformuler, there are two major differences:

  1. L'une est liée au type de tissage. 
  2. Un autre à la définition du point de jonction.

Spring-AOP: Runtime tissé par proxy en utilisant le concept de dynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ: Le temps de compilation lors du tissage via AspectJ Java Tools(ajc compiler) si la source est disponible ou après le tissage après compilation (avec des fichiers compilés). De plus, le temps de chargement avec Spring peut être activé - il nécessite le fichier de définition aspectj et offre une grande flexibilité.

Le tissage en temps de compilation peut offrir des avantages en termes de performances (dans certains cas) ainsi que du joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.

21
techzen

Remarque supplémentaire: Si les performances sous charge élevée sont importantes, vous aurez besoin d'AspectJ, qui est 9 à 35 fois plus rapide que Spring AOP. 10ns vs 355ns peut ne pas sembler beaucoup, mais j'ai vu des gens utiliser BEAUCOUP d'Aspects. 10K des aspects. Dans ces cas, votre demande peut toucher des milliers d'aspects. Dans ce cas, vous ajoutez ms à cette demande.

Voir les repères .

18
Joseph Lust

Le manuel de l'utilisateur du printemps donnera beaucoup d'informations, directement de la bouche du cheval. 

Le chapitre 6.4 - Choix du style de déclaration AOP à utiliser est sans appel pour vous, car il traite des avantages et des inconvénients des deux.

Le paragraphe 6.1.2 - Capacités et objectifs AOP Spring & chapitres 6.2 - @Assistance, et 6.8 - Utiliser AspectJ avec les applications Spring devrait être particulièrement intéressant.

16
elhoim

Le printemps AOP est l'une des parties essentielles du cadre de printemps. Au stade très élémentaire, le cadre printanier est basé sur IoC et AOP. Dans le cours officiel du printemps, il y a une diapositive dans laquelle il est écrit:

L'AOP est l'une des parties les plus importantes du cadre.

Le point clé pour comprendre le fonctionnement de AOP dans Spring est que lorsque vous écrivez un Aspect avec Spring, nous instrumentons le cadre avec la construction d'un proxy pour vos objets, avec une JDKDynamicProxy si votre bean implémente une interface ou via CGLIB si votre bean ne l'implémente pas. toute interface. N'oubliez pas que vous devez avoir cglib 2.2 dans votre chemin de classe si vous utilisez Spring avant la version 3.2. A partir du printemps 3.2, cela ne sert à rien car cglib 2.2 était inclus dans le noyau.

La structure à la création du bean créera un proxy qui encapsulera vos objets et ajoutera des responsabilités transversales telles que la sécurité, la gestion des transactions, la journalisation, etc.

La création de proxy de cette manière sera appliquée à partir d’une expression ponctuelle qui permet au cadre de décider quels beans et méthodes seront créés en tant que proxy. Le conseil sera plus responsable que pour votre code. Rappelez-vous que dans ce processus, le pointcut ne capture que les méthodes publiques qui ne sont pas déclarées comme finales.

Désormais, pendant le Printemps AOP, le conteneur tissera les Aspects au démarrage de celui-ci. Dans AspectJ, vous devez le faire avec une post-compilation de votre code via une modification de bytecode. Pour cette raison, à mon avis, l'approche de Spring est plus simple et plus facile à gérer que AspectJ.

D'autre part, avec le Spring AOP, vous ne pouvez pas utiliser toute la puissance du AOP, car la mise en œuvre se fait par le biais de mandataires et non par la modification de votre code.

Comme dans AspectJ, vous pouvez utiliser le tissage au temps de chargement dans SpringAOP. Vous pouvez bénéficier de cette fonctionnalité au printemps mise en œuvre avec un agent et des configurations spéciales, @EnabledLoadWeaving ou en XML. Vous pouvez utiliser l'espace de noms comme exemple. Cependant, dans Spring AOP, vous ne pouvez pas intercepter tous les cas. Par exemple, la commande new n'est pas prise en charge dans Spring AOP.

Cependant, dans Spring AOP, vous pouvez tirer parti de l'utilisation de AspectJ grâce à la méthode fabrique aspectof dans le bean de configuration printanière.

Pour la raison que Spring AOP est essentiellement un proxy créé à partir du conteneur, vous pouvez donc utiliser AOP uniquement pour les haricots de printemps. Avec AspectJ, vous pouvez utiliser l’aspect dans tous vos grains. Un autre point de comparaison est le débogage et la prévisibilité du comportement du code. Avec Spring AOP, le travail est entièrement réalisé à partir du compilateur Java et les aspects sont un moyen très pratique de créer un proxy pour votre bean Spring. Dans AspectJ, si vous modifiez le code, vous avez besoin de plus de compilation et il peut être difficile de comprendre où vos aspects sont tissés. Même fermer le tissage au printemps est plus simple: avec le printemps, vous supprimez l'aspect de votre configuration, vous redémarrez et tout fonctionne. Dans AspectJ, vous devez recompiler le code!

AspectJ est plus flexible que Spring dans le tissage en temps de chargement, car Spring ne prend pas en charge toutes les options de AspectJ. Mais à mon avis, si vous souhaitez modifier le processus de création d'un bean, une meilleure solution consiste à gérer la connexion personnalisée dans une usine et non avec le tissage en temps de chargement d'un aspect modifiant le comportement de votre nouvel opérateur.

J'espère que ce panorama d'AspectJ et Spring AOP vous aide à comprendre la différence entre les deux potions

9
Valerio Vaudi

Il est important de déterminer si vos aspects seront critiques et où votre code est déployé. Spring AOP signifie que vous comptez sur le tissage au temps de chargement. Cela peut échouer à tisser et, selon mon expérience, des erreurs enregistrées peuvent exister mais n'empêcheront pas l'application de s'exécuter sans le code aspect [J'ajouterais qu'il est possible de le configurer de telle sorte qu'il pas le cas; mais je ne suis pas personnellement au courant ]. Le tissage à la compilation évite cela. 

De plus, si vous utilisez AspectJ en conjonction avec le plug-in aspectj-maven, vous pouvez alors exécuter des tests unitaires sur vos aspects dans un environnement d'infrastructure de confiance et avoir l'assurance que les artefacts construits sont testés et correctement tissés. Bien que vous puissiez certainement écrire des tests unitaires pilotés par Spring, vous n'avez toujours aucune garantie que le code déployé sera celui qui a été testé en cas d'échec de LTW.

Une autre considération est de savoir si vous hébergez l'application dans un environnement dans lequel vous êtes en mesure de surveiller directement le succès ou l'échec du démarrage d'un serveur/d'une application ou si votre application est en cours de déploiement dans un environnement où elle n'est pas sous votre supervision [par ex. où il est hébergé par un client]. Encore une fois, cela indiquerait le moyen de compiler le temps qui passe.

Il y a cinq ans, j'étais beaucoup plus favorable à l'AOP configuré par Spring pour la simple raison qu'il était plus facile de travailler avec et moins susceptible de ronger mon IDE. Cependant, avec l'augmentation de la puissance de calcul et de la mémoire disponible, le problème est moins grave et CTW, avec le plugin aspectj-maven, est devenu un meilleur choix dans mon environnement de travail pour les raisons que j'ai expliquées ci-dessus.

0
kcampbell

Cet article contient également une bonne explication sur le sujet.

Spring AOP et AspectJ ont des objectifs différents.

Spring AOP vise à fournir une mise en œuvre AOP simple à travers Spring IoC pour résoudre les problèmes les plus courants auxquels les programmeurs sont confrontés.

En revanche, AspectJ est la technologie AOP originale qui vise à fournir une solution complète AOP.

0
gce