2010-12-09 27 views
6

J'ai configuré AspectJ avec Spring et cela fonctionne très bien lorsqu'on "attrape" des méthodes publiques appelées hors de la classe. Maintenant, je veux faire quelque chose comme ceci:Aspectj et intercepter des méthodes privées ou internes

public class SomeLogic(){ 

    public boolean someMethod(boolean test){ 

     if(test){ 
     return innerA(); 
     } else { 
     return innerB(); 
     } 
    } 


    private boolean innerA() {// some logic} 
    private boolean innerA() {// some other logic} 

} 

SomeLogic est un SpringBean. Les méthodes innerA() et innerB() peuvent être déclarées privées ou publiques - la méthode someMethod() est appelée à partir d'une action Struts. Est-il possible d'attraper avec AspectJ les méthodes innerA() ou innerB() appelées par someMethod()?

Ma config (basé sur XML):

<aop:aspect id="innerAAspect" ref="INNER_A"> 
     <aop:pointcut id="innerAService" expression="execution(* some.package.SomeLogic.innerA(..))"/> 
    </aop:aspect> 

    <aop:aspect id="innerAAround" ref="INNER_A"> 
     <aop:around pointcut-ref="innerAService" method="proceed"/> 
    </aop:aspect> 


    <aop:aspect id="innerBAspect" ref="INNER_B"> 
     <aop:pointcut id="innerBService" expression="execution(* some.package.SomeLogic.innerB(..))"/> 
    </aop:aspect> 

    <aop:aspect id="innerBAround" ref="INNER_B"> 
     <aop:around pointcut-ref="innerBService" method="proceed"/> 
    </aop:aspect> 
+0

Dites-nous ce que vous avez pour vos expressions AspectJ. Je n'ai jamais eu de problème avec public vs privé auparavant. –

+0

Pourriez-vous poster un exemple? – awonline

Répondre

5

Oui, il est facile d'attraper des méthodes privées avec AspectJ.

Un exemple qui imprime une phrase avant que toutes les méthodes privées:

@Pointcut("execution(private * *(..))") 
public void anyPrivateMethod() {} 

@Before("anyPrivateMethod()") 
public void beforePrivateMethod(JoinPoint jp) { 
    System.out.println("Before a private method..."); 
} 

Si vous connaissez Eclipse, je recommande de développer AspectJ avec STS ou seulement installer le AJDT plugin.

Vous trouverez plus d'informations sur les capacités Spring AOP dans la documentation de référence de Spring here.

+0

Merci, ça marche bien. Je pense que le problème est avec la configuration de Spring que les méthodes publiques sont "attrapées", et privées ou appelées de l'intérieur des haricots pas. – awonline

+2

C'est. Spring AOP utilise des objets proxy ou CGLIB et aucune de ces alternatives ne le supporte. C'est pourquoi les aspects Spring prennent également en charge AspectJ. – Espen

+0

Alors est-ce possible ou pas? (Aspectj + Spring + attraper des méthodes privées) – awonline