Domanda

Mi piacerebbe usare aspectj al profilo una biblioteca. Il mio piano era quello di segnare metodi che richiedono profilatura con un'annotazione:

@Profiled("logicalUnitOfWork")

E poi hanno un aspetto che avrebbe sparato prima e dopo i metodi che avrebbe usato il logicalUnitOfWork per evidenziare il contenuto profilato.

Quindi, la mia pointcut per iniziare con un look come questo. Si noti che non ho l'argomento per l'annotazione qui; questa è una delle cose che non sono sicuro di come fare:

pointcut profiled() : execution(@Profiled * *());

before() : profiled () {
    // : the profiled logical name is in this variable:
String logicalEventType;
Profiler.startEvent (logicalEventType);
}

after() returning : profiled() {
    // : the profiled logical name is in this variable:
String logicalEventType;
    Profiler.endEvent (logicalEventType);
}

I metodi di essere profilate sarebbero definiti in questo modo:

@Profiled("someAction")
public void doAction (args...) {}

In breve, come posso ottenere il valore dell'annotazione @Profiled nell'aspetto? Non ho bisogno di limitare che profilazione si verifica basata sul valore, ho solo bisogno di essere visibili al consiglio. Inoltre, fare ho bisogno di avere impostato la ritenzione del annotazioni a runtime per questo al lavoro, o posso avere la conservazione a livello di classe, invece?

È stato utile?

Soluzione

Non sono sicuro se questo è il modo migliore per farlo, ma si potrebbe provare qualcosa di simile:


   pointcut profiledOperation(Profiled p) : 
      execution(@Profiled * *()) && @annotation(p);

   before(Profiled p): profiledOperation(p)
   {
      System.out.println("Before " + p.value());
   }

   after(Profiled p): profiledOperation(p)
   {
      System.out.println("After " + p.value());
   }

Dal momento che è necessario per accedere al valore di annotazione in fase di esecuzione si dovrà impostare il @Retention a RUNTIME.

Altri suggerimenti

Ho fatto qualcosa di simile un po 'indietro di annotare i campi con "valori di default". Ho cercato di adattarlo ai metodi annotati, che shoud trovare lavoro. Voi, naturalmente, dovrebbe aggiungere un po 'di controllo degli errori e null-test qui da quando ho lasciato che per brevità.

È possibile ottenere il valore dell'annotazione utilizzando parte statica del punto di unirsi.

private String getOperationName(final JoinPoint joinPoint) {
   MethodSignature methodSig = (MethodSignature) joinPoint
      .getStaticPart()
      .getSignature();
   Method method = methodSig.getMethod();
   Profiled annotation = method.getAnnotation(Profiled.class);
   return annotation.value();
}

Per evitare troppa riflessione, è probabilmente una buona idea di utilizzare consiglio around invece:

around(): profiled() {
   String opName = getOperationName(thisJoinPoint);
   Profiler.startEvent(opName);
   proceed();
   Profiler.endEvent(opName);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top