Considérez deux méthodes définies dans ABC.java :< ;/p>
<br>public void method1() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">method2();
}
public void method2() {}
< ;/pre>
Pour appliquer AOP sur les appels de méthode2, vous avez défini une classe AOPLogger.java avec une méthode d'aspect checkAccess. Dans votre fichier de configuration :
<br><bean id="advice" class="p.AOPLogger" /><br><aop:config> </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><aop:pointcut id="abc" expression="execution(*p.ABC.method2(..))" /> <aop:aspect id="service" ref="advice"> <aop:before pointcut-ref="abc" method="checkAccess" /> </aop:aspect>
Cependant, lorsque la méthode2 est invoquée, la méthode checkAccess dans AOPLogger n'est pas déclenchée.
L'aspect AOP est appliqué à un proxy entourant le bean. Lorsque vous obtenez une référence à un bean, vous ne travaillez pas réellement avec la classe spécifiée dans votre configuration. Au lieu de cela, une classe synthétique vous est présentée qui implémente les interfaces appropriées, délègue les appels et fournit des fonctionnalités supplémentaires (par exemple, votre AOP).
Dans ce cas, vous êtes en appelant directement method2 sur la classe. Si l'instance de cette classe était injectée dans un autre bean en tant que bean Spring, elle serait injectée en tant que proxy. En conséquence, tous les appels de méthode seraient dirigés vers le proxy (et les aspects seraient déclenchés).
< p>Pour résoudre ce problème, envisagez les options suivantes :
<li>Separate method1 and method2 into distinct beans.</li> <li>Employ a non-Spring AOP framework.</li>
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!