Quero monitorar todos os métodos públicos de todas as classes com anotação especificada (por exemplo, @Monitor) (observação: a anotação está no nível da classe). Qual poderia ser um possível argumento para isso? Nota: Estou usando o Spring AOP no estilo @AspectJ.
java
aop
aspectj
spring-aop
Rejeev Divakaran
fonte
fonte
Respostas:
Você deve combinar um tipo de corte de ponto com um método de corte de ponto.
Esses apontamentos farão o trabalho para encontrar todos os métodos públicos dentro de uma classe marcada com uma anotação @Monitor:
Aconselhe o último apontador que combina os dois primeiros e pronto!
Se você estiver interessado, escrevi uma folha de dicas com o estilo @AspectJ aqui, com um documento de exemplo correspondente aqui.
fonte
Usando anotações, conforme descrito na pergunta.
Anotação:
@Monitor
Anotação na aula
app/PagesController.java
:Anotação no método
app/PagesController.java
:Anotação personalizada
app/Monitor.java
:Aspecto para anotação
app/MonitorAspect.java
:Ativar AspectJ,
servlet-context.xml
:Inclua bibliotecas AspectJ
pom.xml
:fonte
Monitor
precisa ser uma primaveraComponent
?Component
anotação é usada para dizer ao contêiner Spring para aplicar a inclusão da classe na coisa de tecelão AspectJ. Por padrão, Primavera só olha paraController
,Service
e outras anotações específicas, mas nãoAspect
.@Component
anotação no@interface
não oAspect
. Por que isso é necessário?@Component
anotação faz com que o Spring o compile com o sistema orientado a aspectos AspectJ IoC / DI. Não sei como dizer de forma diferente. docs.spring.io/spring/docs/3.2.x/spring-framework-reference/...Algo parecido:
Observe que você não deve ter nenhum outro conselho sobre a mesma classe antes desta, porque as anotações serão perdidas após o proxy.
fonte
Usar
fonte
deve ser o suficiente para marcar seu método de aspecto assim:
dê uma olhada nisso para obter um guia passo a passo sobre isso.
fonte
Você também pode definir o corte de ponto como
fonte
execution(public * @Monitor *.*(..))
Trabalhos pouco mais simples também.A maneira mais simples parece ser:
Ele interceptará a execução de todos os métodos anotados especificamente com '@MyHandling' na classe 'YourService'. Para interceptar todos os métodos sem exceção, basta colocar a anotação diretamente na classe.
Não importa o escopo privado / público aqui, mas lembre-se de que o spring-aop não pode usar o aspecto para chamadas de método na mesma instância (normalmente privadas), porque não usa a classe proxy nesse caso.
Usamos os conselhos @Around aqui, mas é basicamente a mesma sintaxe de @Antes, @Depois ou de qualquer conselho.
A propósito, a anotação @MyHandling deve ser configurada da seguinte maneira:
fonte
// perform actions after
nunca será chamado, pois retornamos o valor na linha antes.Você pode usar o PerformanceMonitoringInterceptor do Spring e registrar programaticamente o conselho usando um processador de beanpost.
fonte
De Spring
AnnotationTransactionAspect
:fonte