Frühling 3 AOP kommentierte Ratschläge
Frage
Ich versuche herauszufinden, wie ich meine Beans auf kommentierte Weise mit AOP-Ratschlägen versehen kann.
Ich habe eine einfache Klasse
@Service
public class RestSampleDao {
@MonitorTimer
public Collection<User> getUsers(){
....
return users;
}
}
Ich habe eine benutzerdefinierte Anmerkung zur Überwachung der Ausführungszeit erstellt
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorTimer {
}
und raten zu einer Fake-Überwachung
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;
}
}
}
Jetzt kann ich es verwenden, wenn ich die Dao-Instanz manuell auf diese Weise vertrete
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() );
Aber wie richte ich es in Spring ein, damit meine benutzerdefinierten annotierten Methoden automatisch von diesem Interceptor weitergeleitet werden?Ich möchte ein Proxy-SamepleDao anstelle eines echten injizieren.Geht das ohne XML-Konfigurationen?
Ich denke, es sollte möglich sein, nur Methoden zu kommentieren, die ich abfangen möchte, und Spring DI würde das Notwendige vertreten.
Oder muss ich dafür AspectJ verwenden?würde die einfachste Lösung bevorzugen :-)
Vielen Dank für die Hilfe!
Lösung
Sie müssen AspectJ nicht verwenden, können aber AspectJ-Annotationen mit Spring verwenden (siehe 7.2 @AspectJ-Unterstützung):
@Aspect
public class AroundExample {
@Around("@annotation(...)")
public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
...
}
}