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!

War es hilfreich?

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 {
        ...
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top