AOP doesn't create proxy for superclass's method for web applications
Hi, guys
I faced a problem with proxing classes hierarhy.
Problem:
Code:
package com.main;
public interface A {
void find();
void query();
}
Code:
package com.main;
public class B implements A {
public void find() {
}
public void query() {
}
}
Code:
package com.main.test;
import com.main.A;
import com.main.B;
import com.main.annotation.TimeTracked;
@TimeTracked("cool")
public class C extends B {
public void find() {
}
}
Code:
package com.main.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface TimeTracked {
String value();
}
Aspect:
Code:
package com.main.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class TimeTrackingAspect {
@Pointcut("@within(com.jingit.commons.logging.statistic.time.TimeTracked)")
private void annotatedClass() {
}
@Pointcut("execution(public * *.*(..))")
private void publicMethod() {
}
@Around("annotatedClass() && publicMethod()")
public Object trackAnnotatedClassCalls(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("trackAnnotatedClassCalls");
return proceedingJoinPoint.proceed();
}
}
And I use class C like:
Code:
@Autowired
private A c;
There are all necessary Spring configs and so on.
Problem is when I use "c" bean in unit tests aspect catches all methods "find" and "query" but when I use "c" bean in my spring mvc web application aspect catches only "find" method that is overrided in class C.
What I have found is the different between these two cases it is application contexts.
Could you help me to solve this problem? May be you have some advice, expirience with it and so on.
Best regards,
Andrey.