L'utilisation de proxys, au Printemps de l'AOP
Je suis la lecture d'un livre, qui parle de l'activation AspectJ soutien au Printemps de l'AOP.
Donné ci-dessous est un paragraphe tiré du livre:
Pour activer les annotations AspectJ soutien au Printemps conteneur IoC, vous n'avez qu'à définir vide
L'élément XML aop:aspectj-autoproxy dans votre bean fichier de configuration. Puis, le Printemps sera automatiquement
créer des proxys pour l'un de vos haricots qui correspondent à vos aspects AspectJ.Pour les cas dans lesquels les interfaces ne sont pas disponibles ou ne pas les utiliser dans une application de conception, il est possible de
créer des proxys, en s'appuyant sur CGLIB. Pour activer CGLIB, vous devez définir l'attributproxy-target-class=true
dans<aop:aspectj-autoproxy />
.
Je ne suis pas en mesure d'obtenir le deuxième paragraphe. Qu'entend-on par " interfaces ne sont pas disponibles'. Quelqu'un peut illustrer cela par un exemple ?
Vous devez vous connecter pour publier un commentaire.
Spring AOP utilise le JDK proxies dynamiques ou CGLIB pour créer les procurations pour vos objets cible.
En fonction de Printemps de la documentation, dans le cas où votre cible met en œuvre au moins une interface, un JDK dynamique proxy sera utilisé. Toutefois, si votre objet cible ne met pas en oeuvre les interfaces puis un CGLIB proxy sera créé.
C'est comment vous pouvez forcer la création de l'CGLIB procurations (configurer le proxy-cible class="vrai"):
Lors de l'utilisation d'AspectJ et ses autopoxy support, vous pouvez également forcer CGLIB procurations. C'est là que le
<aop:aspectj-autoproxy>
est utilisé, et aussi ici, le "proxy-cible de la classe" doit être réglé sur vrai:Veuillez vous référer à l'utilisation de Proxy mécanismes de la section de La Programmation Orientée aspects avec le Printemps documentation pour plus de détails.
Printemps préfère utiliser les interfaces pour les AOP, car il peut utiliser le JDK les procurations.
Dire par exemple j'ai une interface
MyService
Et une mise en œuvre
MyServiceImpl
Si le Printemps découvre que vous avez configuré les aspects de
MyService
, il va créer un JDK Proxy qui implémenteMyService
et puis proxy tous les appels par le biais de votreMyServiceImpl
bean, l'ajout de l'aspect et de la fonctionnalité appropriée.JDK procurations de travail par la mise en œuvre de la même interface que votre objet cible et la délégation d'appels d'elle; ils ne fonctionnent pas si il n'y a pas d'interface à mettre en œuvre. Dans le cas où vous n'avez pas une interface comme ci-dessus, le Printemps a besoin d'utiliser un octet code de la bibliothèque comme CGLIB de créer dynamiquement des classes au moment de l'exécution qui intègrent l'aspect de la fonctionnalité.
J'ai trouvé un blog ici qui explique clairement comment l'AOP,la mise en Cache & Transaction fonctionne à l'aide d'exécution des classes proxy.
Lorsqu'il n'est pas de codage de l'interface (citant le blog de la section " Que si la fève de classe n'implémente pas l'interface?'):-
Spring AOP fait un large usage de procurations, comme un mécanisme pour mettre en œuvre les sujets transversaux (un.k.un des aspects) dans un non-intrusive façon, l'idée est en fait d'utiliser les proxies comme emballages qui enrichissent l'origine du comportement, c'est à dire ajouter des capacités transactionnelles.
Pour réaliser cela, il ya deux options, en fonction de si l'origine de l'objet implémente une interface ou pas.
Dans le premier cas (l'objet original met en œuvre au moins une interface) la dynamique de proxy capacités de réflexion, l'API est utilisée pour créer un objet proxy qui IMPLÉMENTE les mêmes interfaces que l'objet d'origine et, par conséquent, le proxy peut être utilisé à la place.
Dans le second cas (à l'origine, l'objet n' PAS mettre en œuvre une interface), donc un truc plus élaboré doit être utilisé, et c'est quand CGLIB s'affiche. Selon la page du projet "CGLIB est utilisé pour étendre des classes Java et met en œuvre des interfaces lors de l'exécution". Dans ce cas, l'astuce consiste à créer un proxy qui s'ÉTEND l'objet d'origine et, par conséquent, peut être utilisé à la place.