Aperçu
Le module Spirng-AOP est le module de base dans le framework Spring. Bien que le conteneur Spring IOC ne se fasse pas sur AOP, AOP fournit une solution puissante et flexible à la mise en œuvre du CIO.
Dans Spring Framework, AOP est principalement utilisé à deux fins:
D'un point de vue fonctionnel, AOP peut être considéré comme un complément à la méthode de programmation OOP, fournissant un moyen différent de code ou d'organisation système. Le concept principal de la POO est la classe, et dans AOP est l'aspect.
Le module Spirng-AOP est le module de base dans le framework Spring. Bien que le conteneur Spring IOC ne se fasse pas sur AOP, AOP fournit une solution puissante et flexible à la mise en œuvre du CIO.
Dans Spring Framework, AOP est principalement utilisé à deux fins:
Spring AOP est implémenté en Java pur et ne nécessite pas de traitement spécial de compilation et ne nécessite pas de contrôle de la hiérarchie du chargeur de classe, il peut donc être utilisé pour le conteneur servlet et d'autres serveurs d'applications.
Spring AOP prend actuellement en charge uniquement la commutation ou l'interception au niveau de la méthode, et l'interception d'attribut n'est pas prise en charge maintenant. Si vous souhaitez intercepter les attributs, vous pouvez envisager d'utiliser le langage AspectJ.
Spring AOP est utilisé différemment de la plupart des autres cadres AOP. Son objectif principal n'est pas de fournir un ensemble important et complet d'implémentations AOP, mais d'intégrer différentes implémentations AOP et de collaborer avec Spring IOC pour aider à résoudre certains problèmes communs.
Il convient de noter que certains conseils à grain fin (comme le modèle de domaine), Spring AOP ne fournit souvent pas un bon soutien, et ce scénario considère toujours AspectJ. Même ainsi, en général, le mécanisme puissant de Spring AOP peut toujours résoudre les problèmes dans la plupart des scénarios.
Alors, comment devons-nous voir Spring AOP et AspectJ, citant le texte original des documents officiels de Spring:
Spring AOP n'a jamais du mal à rivaliser avec AspectJ pour fournir une solution AOP complète. Nous pensons que les deux cadres basés sur la proxy comme Spring AOP et les cadres à part entière tels que AspectJ sont précieux et qu'ils sont complets, plutôt que en concurrence. Spring intègre de manière transparente Spring AOP et IOC à AspectJ, pour permettre à toutes les utilisations d'AOP d'être traitées dans une architecture d'application cohérente basée sur le ressort. Cette intégration n'affecte pas l'API Spring AOP ou l'API AOP Alliance: Spring AOP reste compatible en arrière.
Dans toutes les conceptions de modules de framework Spring, l'un des principes de base qui est toujours adhéré est non invasif.
Par conséquent, lors de l'utilisation de Spring AOP, nous ne nous obligerons pas à introduire des classes ou des interfaces spécifiques dans le code commercial, ce qui peut garder le code propre et découpler dans la mesure maximale. Cependant, Spring offre également une autre option, s'il existe un scénario spécifique, vous pouvez introduire directement Spring AOP dans votre code. Presque tous les modules des cadres de printemps vous donneront une variété de choix dans la façon dont ils sont utilisés afin que les utilisateurs puissent choisir un moyen plus adapté à leurs scénarios. Utilisez AspectJ ou Spring AOP, utilisez l'annotation ou la méthode de configuration XML, dépend de U.
Après avoir compris les scénarios d'intention et d'utilisation initiaux de Spring AOP, jetons un coup d'œil à son principe de mise en œuvre générale
La plupart des problèmes dans le monde du logiciel peuvent être résolus en ajoutant une couche.
La couche mentionnée ici est bien sûr dans un sens large, qui peut être une abstraction ou un cache, ce qui signifie à peu près la catégorie d'isolement et de découplage.
Dans le monde du printemps, l'introduction de chaque module, ou l'intégration des technologies tierces, fournira toujours une couche d'abstraction, fournissant une API unifiée aux utilisateurs, bloquant tous les détails d'implémentation et les différences entre les différentes implémentations. Par exemple, des modules tels que Spring-Cache, Spring-JDBC, Spring-JMS et Spirng-Message fournissent tous une couche d'abstraction.
L'implémentation Spring AOP est un mécanisme basé sur proxy, qui utilise par défaut JDK dynamic proxy, et peut également utiliser le proxy CGLIB. La différence entre les deux est principalement la différence entre les objets proxés. Lorsque l'objet cible est une interface, le proxy dynamique JDK peut compléter le proxy, mais lorsque l'objet cible n'implémente pas la classe d'interface (essayez d'être moins, la programmation orientée vers l'interface est une bonne habitude), il est nécessaire d'utiliser le proxy CGLIB pour compléter le proxy. Bien sûr, vous pouvez également forcer l'interface à utiliser CGLIB comme proxy; De plus, lorsque des types spécifiques doivent être injectés ou référencés, si l'objet référencé est exactement l'objet proxy, vous devez également utiliser la méthode CGLIB.
La conception fonctionnelle et la mise en œuvre peuvent être divisées en deux parties principales
Création de AOP
La classe de base qui génère l'objet proxy, ProxyFactoryBean getObject ()
Le chiffre suivant est la logique de sélection de l'utilisation de JDK ou CGLIB lors de la génération d'un proxy:
Après avoir trouvé l'exécuteur spécifique de l'agent de génération, quand s'appelle cette opération? Ceux qui ont compris le cycle de vie des haricots de printemps devraient savoir que lorsqu'un haricot est créé, il existe une série d'interfaces de rappel pour les utilisateurs pour insérer des comportements personnalisés pour influencer certaines des caractéristiques du haricot. BeanPostProcessor est l'une des interfaces. Des articles précédents ont été introduits (l'arme ultime pour jouer avec les haricots de printemps). Spring AOP a profité de cette occasion pour insérer une astuce en train de créer un haricot. Si le bean créé est notre cible AOP, créez un proxy et renvoyez enfin l'objet proxy sur IOC.
AbstractAutoproxyCreator Cette classe est une implémentation de BeanPostProcessor, utilisée pour créer un proxy, voir la méthode de post-traitement de ce processeur et renvoie enfin le proxy renvoyé par la méthode CreateProxy ().
Exécution améliorée des sections AOP
Il peut être compris comme un appel à toutes les chaînes interceptrices de l'objet cible
Puisqu'il existe deux implémentations spécifiques de Spring AOP, JDK Dynamic Proxy et CGLIB, les méthodes d'exécution des intercepteurs sont différentes. Pour plus de détails, vous pouvez lire le code source JDKDAMICAOPPROXY INVOCE Méthode
L'appel à la méthode cible s'appuie finalement sur la réflectation de réflection.
Le traitement du processus dans RefleviveMethodInvocation utilise une méthode récursive pour traiter les chaînes d'interception.
Méthode d'interception de cglibaopproxy
CGLIBMethodinvocation hérite de la réflection de réflection et de la méthode process () ci-dessus pour gérer les chaînes d'interception.
Deux détails à noter lors de l'utilisation de Spring AOP:
1. Spring AOP ne fonctionne pas lors de l'appel de la méthode à l'intérieur de la classe (auto-invoke), car l'appel interne ne passe pas l'objet proxy et est directement utilisé. Les solutions sont:
2. Lorsque vous injectez des haricots, si vous souhaitez injecter le type spécifique de haricot au lieu de l'interface, utilisez CGLIB
Spring AOP a des fonctions puissantes et une conception intelligente. Le contexte principal est trié ici, et les détails ne seront pas discutés un par un.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.