2010-12-09 10 views
6

Configuré AspectJ con Spring y funciona bien cuando se "captura" un método público llamado desde fuera de la clase. Ahora quiero hacer algo como esto:Aspectj y captura de métodos privados o internos

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 es un SpringBean. Los métodos innerA() y innerB() podrían declararse como privados o públicos: el método someMethod() se llama desde una acción de Struts. ¿Es posible atrapar con AspectJ los métodos innerA() o innerB() invocados desde someMethod()?

Mi config (XML basado):

<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

Cuéntanos qué tienes para tus expresiones AspectJ. Nunca he tenido un problema con público vs privado antes. –

+0

¿Podría publicar un ejemplo? – awonline

Respuesta

5

Sí, es fácil coger métodos privados con AspectJ.

Un ejemplo que imprime una sentencia antes de que todos los métodos privados:

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

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

Si está familiarizado con Eclipse, lo recomiendo para desarrollar AspectJ con STS o solamente instalar el AJDT plugin.

Más información sobre las capacidades de primavera AOP se puede encontrar en la documentación de referencia primavera here.

+0

Gracias, funciona bien. Creo que el problema es con la configuración de Spring que los métodos públicos están "atrapados", y privados o no llamados desde inner beans. – awonline

+2

Lo es. Spring AOP utiliza objetos proxy o CGLIB y ninguna de esas alternativas lo admite. Es por eso que Spring Aspect también apoya AspectJ. – Espen

+0

Entonces, ¿es posible o no? (Aspectj + Spring + métodos privados de captura) – awonline

Cuestiones relacionadas