весна 3 АОП аннотированный советует - PullRequest
1 голос
/ 18 января 2010

Попытка выяснить, как проксировать мои bean-компоненты с помощью советов AOP в аннотированной форме.

У меня есть простой класс

@Service
public class RestSampleDao {

    @MonitorTimer
    public Collection<User> getUsers(){
                ....
        return users;
    }
}

Я создал пользовательскую аннотацию для мониторинга времени выполнения

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorTimer {
}

и посоветуйте сделать какой-нибудь фальшивый мониторинг

public class MonitorTimerAdvice implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable{
        try {
            long start = System.currentTimeMillis();
            Object retVal = invocation.proceed();
            long end = System.currentTimeMillis();
            long differenceMs = end - start;
            System.out.println("\ncall took " + differenceMs + " ms ");
            return retVal;
        } catch(Throwable t){
            System.out.println("\nerror occured");
            throw t;
        }
    }
}

Теперь я могу использовать его, если я вручную прокси-экземпляр экземпляра Дао, как это

    AnnotationMatchingPointcut pc = new AnnotationMatchingPointcut(null, MonitorTimer.class);
    Advisor advisor = new DefaultPointcutAdvisor(pc, new MonitorTimerAdvice());

    ProxyFactory pf = new ProxyFactory();
    pf.setTarget( sampleDao );
    pf.addAdvisor(advisor);

    RestSampleDao proxy = (RestSampleDao) pf.getProxy();
    mv.addObject( proxy.getUsers() );

но как мне настроить его в Spring, чтобы мои собственные аннотированные методы автоматически передавались этим перехватчиком? Я хотел бы ввести прокси же samepleDao вместо реального. Можно ли это сделать без конфигурации XML?

Я думаю, что можно просто аннотировать методы, которые я хочу перехватить, и пружина D проксирует то, что необходимо.

или я должен использовать аспектj для этого? предпочел бы самое простое решение: -)

Большое спасибо за помощь!

1 Ответ

3 голосов
/ 18 января 2010

Вам не нужно использовать AspectJ, но вы можете использовать аннотации AspectJ с Spring (см. 7.2 @ AspectJ support ):

@Aspect
public class AroundExample {
    @Around("@annotation(...)")
    public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
        ...
    }
}
...