Pergunta

Eu gostaria de usar aspectj ao perfil de uma biblioteca. Meu plano era métodos marca que exigem de perfil com uma anotação:

@Profiled("logicalUnitOfWork")

E, em seguida, tem um aspecto que iria atirar antes e depois de métodos que usam o logicalUnitOfWork para destacar o conteúdo perfilado.

Então, meu pointcut para começar com olhares como este. Note que eu não tenho o argumento para a anotação aqui; Essa é uma das coisas que eu não sei como fazer:

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);
}

Os métodos que estão sendo perfilados seria definida assim:

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

Em suma, como posso obter o valor da anotação @Profiled no aspecto? Eu não preciso restringir os perfis ocorre com base no valor, eu só preciso que ele seja visível para o conselho. Além disso, eu preciso ter set retenção da anotação a tempo de execução para este ao trabalho, ou eu posso ter a retenção em nível de classe em vez disso?

Foi útil?

Solução

Eu não tenho certeza se esta é a melhor maneira de fazê-lo, mas você pode tentar algo como:


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

Uma vez que você precisar acessar o valor de anotação em tempo de execução você terá que definir o @Retention para RUNTIME.

Outras dicas

Eu fiz algo semelhante a um tempo atrás a campos anotar com "valores por defeito". Eu tentei adaptá-lo aos métodos anotados, que valores deviam encontrar trabalho. Você, é claro, deve adicionar um pouco de verificação de erros e aqui-teste nulo desde que eu deixei isso por razões de brevidade.

Você pode obter o valor da anotação usando a juntar-se parte estática de ponto.

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

Para evitar o excesso de reflexão, é provavelmente uma boa idéia para aconselhamento uso around vez:

around(): profiled() {
   String opName = getOperationName(thisJoinPoint);
   Profiler.startEvent(opName);
   proceed();
   Profiler.endEvent(opName);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top