Spring AOP est l'une des parties essentielles du cadre à ressort. Au stade très basique, le framework Spring est basé sur IoC et AOP. Dans le cours officiel du printemps, il y a une diapositive dans laquelle il est dit:
L'AOP est l'une des parties les plus importantes du cadre.
Le point clé pour comprendre comment fonctionne AOP dans Spring est que lorsque vous écrivez un Aspect avec Spring, nous instrumentons le framework avec la construction d'un proxy pour vos objets, avec un JDKDynamicProxy
si votre bean implémente une interface ou via CGLIB si votre bean n'implémente aucun 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. À partir de Spring 3.2, cela ne sert à rien car cglib 2.2 a été inclus dans le noyau.
Le framework lors de 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 en commençant par une expression de découpage qui instruit le framework pour décider quels beans et méthodes seront créés en tant que proxy. Le conseil sera plus responsable que pour votre code. N'oubliez pas que dans ce processus, le pointcut capture uniquement les méthodes publiques qui ne sont pas déclarées comme finales.
Maintenant, alors que dans Spring AOP, le tissage des Aspects sera effectué par le conteneur au démarrage du conteneur, dans AspectJ vous devez effectuer cela avec une post-compilation de votre code via la modification du bytecode. Pour cette raison, à mon avis, l'approche Spring est plus simple et plus gérable que AspectJ.
D'un autre côté, avec Spring AOP, vous ne pouvez pas utiliser toute la puissance d'AOP car l'implémentation se fait via des proxys et non avec une modification de votre code.
Comme dans AspectJ, vous pouvez utiliser le tissage au moment du chargement dans SpringAOP. Vous pouvez bénéficier de cette fonctionnalité au printemps est implémentée avec un agent et des configurations spéciales, @EnabledLoadWeaving
ou en XML. Vous pouvez utiliser l'espace de nom comme exemple. Cependant, dans Spring AOP, vous ne pouvez pas intercepter tous les cas. Par exemple, la new
commande n'est pas prise en charge dans Spring AOP.
Cependant, dans Spring AOP, vous pouvez bénéficier de l'utilisation d'AspectJ grâce à l'utilisation de la aspectof
méthode d'usine dans le bean de configuration de ressort.
Pour la raison que Spring AOP est essentiellement un proxy créé à partir du conteneur, vous ne pouvez donc utiliser AOP que pour les beans spring. Alors qu'avec AspectJ vous pouvez utiliser l'aspect dans tous vos beans. Un autre point de comparaison est le débogage et la prévisibilité du comportement du code. Avec spring AOP, le travail est préformé à partir du compilateur Java et les aspects sont un moyen très cool de créer un proxy pour votre bean Spring. Dans AspectJ, si vous modifiez le code, vous avez besoin de plus de compilation et comprendre où vos aspects sont tissés peut être difficile. Même arrêter le tissage au printemps est plus simple: avec le ressort vous supprimez l'aspect de votre configuration, redémarrez et cela fonctionne. Dans AspectJ vous devez recompiler le code!
Dans le tissage au moment du chargement, AspectJ est plus flexible que Spring car Spring ne prend pas en charge toutes les options d'AspectJ. Mais à mon avis Si vous souhaitez modifier le processus de création d'un bean, un meilleur moyen est de gérer la connexion personnalisée dans une usine et non avec le tissage au chargement d'un aspect qui change le comportement de votre nouvel opérateur.
J'espère que ce panoramique d'AspectJ et Spring AOP vous aidera à comprendre la différence des deux potions