Я пытался понять, почему мой простой аспект не выполняется. Я посмотрел на ответы похожих проблем, но все еще не могу заставить его работать.
Мое намерение состоит в том, чтобы обернуть выполнение метода, аннотированного пользовательской аннотацией, советом AOP, который будет отслеживать, сколько времени занимает выполнение метода. Когда я запускаю тест, я вижу вывод метода, но совет не выполняется (я ожидаю, что он запишет какой-то вывод).
Вот класс Aspect:
@Aspect
class LatencyProfiler {
private LatencyTrackerFactory factory = LatencyTrackerFactory.NOOP;
@Pointcut(value="execution(@ProfileLatency * *(..)) && @annotation(annotation)", argNames="annotation")
public void profiled(ProfileLatency annotation) {}
@Around(value="profiled(annotation)", argNames="pjp,annotation")
public Object profile(ProceedingJoinPoint pjp, ProfileLatency annotation) throws Throwable {
ILatencyTracker tracker;
try {
tracker = factory.create(annotation.trackerName(), annotation.trackerNameSuffix());
} catch (ConfigException e) {
throw new RuntimeException(e);
}
tracker.begin();
Object ret = pjp.proceed();
tracker.end(null);
return ret;
}
@Optional
public void setFactory(LatencyTrackerFactory factory) {
this.factory = factory;
}
}
Далее следует аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ProfileLatency {
String trackerName();
String trackerNameSuffix() default"[unassigned]";
}
За ним следует тестовый класс:
public class Test {
private static final Log LOG = LogFactory.getLog(Test.class);
@PostConstruct
public void init() {
Executors.newSingleThreadScheduledExecutor().schedule(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 60; i++) {
foo();
LOG.info("HERE");
}
}
}, 2000, TimeUnit.MILLISECONDS);
}
@ProfileLatency(trackerName = "latency", trackerNameSuffix = "s")
public void foo() {
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
}
}
Конфигурация пружины:
<context:annotation-config/>
<aop:aspectj-autoproxy>
<aop:include name="latencyProfileAspect"/>
</aop:aspectj-autoproxy>
<bean
id = "latencyLogger"
class = "util.logging.LatencyLogger"
/>
<bean
id = "trackerFactory"
class = "util.latency.LatencyTrackerFactoryImpl">
<constructor-arg value = "config/latency-config.xml"/>
<constructor-arg ref = "latencyLogger"/>
</bean>
<bean
id = "latencyProfileAspect"
class = "util.latency.aop.LatencyProfiler"
p:factory-ref = "trackerFactory"
/>
<bean id = "test" class="util.Test"/>
и, наконец, вывод теста:
21:20:37,930 INFO main/SpringMain - Ready.
21:20:40,928 INFO pool-4-thread-1/Test - HERE
21:20:41,927 INFO pool-4-thread-1/Test - HERE
21:20:42,926 INFO pool-4-thread-1/Test - HERE
21:20:43,925 INFO pool-4-thread-1/Test - HERE
21:20:44,924 INFO pool-4-thread-1/Test - HERE
...
Любой совет с благодарностью.