Maison  >  Article  >  Java  >  Pourquoi mon aspect AOP n’est-il pas invoqué dans les appels de méthodes imbriquées ?

Pourquoi mon aspect AOP n’est-il pas invoqué dans les appels de méthodes imbriquées ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 15:51:02325parcourir

Why is my AOP Aspect Not Invoked in Nested Method Calls?

Appels de méthodes imbriquées et Spring AOP

Considérez le code suivant dans ABC.java :

<code class="java">public void method1() {
    // ...
    method2();
    // ...
}

public void method2() {
    // ...
    // ...
}</code>

L'ajout d'AOP à la méthode2 implique la création d'un aspect , AOPLogger, contenant une méthode de vérification d'accès, checkAccess. La configuration Spring comprend :

<code class="xml"><bean id="advice" class="p.AOPLogger" />
<aop:config>
    <aop:pointcut id="abc" expression="execution(*p.ABC.method2(..))" />
    <aop:aspect id="service" ref="advice">
        <aop:before pointcut-ref="abc" method="checkAccess" />
    </aop:aspect>
</aop:config></code>

Cependant, l'aspect, checkAccess, n'est pas invoqué lorsque la méthode2 est appelée. Qu'est-ce qui manque ?

Proxies AOP et injections de haricots

AOP fonctionne en appliquant des aspects aux proxys entourant le bean. Lorsqu'un bean est référencé, ce n'est pas la classe instanciée mais une classe synthétique qui délègue à la classe réelle et ajoute des fonctionnalités comme AOP.

Dans l'exemple, method2 est appelée directement sur la classe. Lorsqu'elle est injectée en tant que bean Spring, la classe englobante est injectée en tant que proxy, déclenchant les aspects sur les appels de méthode.

Pour invoquer AOP sur les appels de méthode imbriqués, envisagez les options suivantes :

  1. Séparation des beans : divisez la méthode1 et la méthode2 en beans séparés.
  2. Framework AOP non Spring : utilisez un framework AOP non orienté Spring pour un contrôle plus granulaire sur aspect application.

La documentation Spring fournit plus de détails et des solutions de contournement potentielles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn