2010-01-18 6 views
1

Попытка выяснить, как прокси-сервер моей бобы с советами АОП аннотированным способом.spring 3 AOP anotated советует

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

@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()); 

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

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

или мне нужно использовать aspectj для этого? предпочтительнее простейшее решение: -)

благодарит за помощь!

ответ

3

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

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

спасибо, что решить эту проблему: -) – Art79