Quiero monitorear todos los métodos públicos de todas las clases con una anotación especificada (por ejemplo, @Monitor) (nota: la anotación está en el nivel de la clase). ¿Cuál podría ser un posible punto de corte para esto? Nota: Estoy usando el estilo Spring Asop de @AspectJ.
java
aop
aspectj
spring-aop
Rejeev Divakaran
fuente
fuente
Respuestas:
Debe combinar un tipo de corte de punto con un método de corte de punto.
Estos puntos de corte harán el trabajo para encontrar todos los métodos públicos dentro de una clase marcada con una anotación @Monitor:
¡Consejo el último corte de punto que combina los dos primeros y ya está!
Si está interesado, he escrito una hoja de trucos con el estilo @AspectJ aquí con un documento de ejemplo correspondiente aquí.
fuente
Usando anotaciones, como se describe en la pregunta.
Anotación:
@Monitor
Anotación en clase
app/PagesController.java
:Anotación sobre el método
app/PagesController.java
:Anotación personalizada
app/Monitor.java
:Aspecto de anotación
app/MonitorAspect.java
:Habilitar AspectJ,
servlet-context.xml
:Incluya las bibliotecas de AspectJ
pom.xml
:fuente
Monitor
tiene que ser una primaveraComponent
?Component
anotación se usa para indicarle al contenedor Spring que aplique la clase en el aspecto de tejedor AspectJ. Por defecto, sólo se basa en la primaveraController
,Service
y otras anotaciones específicas, pero noAspect
.@Component
anotación en el@interface
no elAspect
. ¿Por qué es eso necesario?@Component
anotación hace que Spring lo compile con el sistema orientado a aspectos AspectJ IoC / DI. No sé cómo decirlo de manera diferente.docs.spring.io/spring/docs/3.2.x/spring-framework-reference/…Algo como eso:
Tenga en cuenta que no debe tener ningún otro consejo sobre la misma clase antes de esta, porque las anotaciones se perderán después de la representación.
fuente
Utilizar
fuente
debería ser suficiente para marcar su método de aspecto de esta manera:
Eche un vistazo a esto para obtener una guía paso a paso sobre esto.
fuente
También puede definir el punto de corte como
fuente
execution(public * @Monitor *.*(..))
Trabajos un poco más simples también.La forma más simple parece ser:
Interceptará la ejecución de todos los métodos específicamente anotados con '@MyHandling' en la clase 'YourService'. Para interceptar todos los métodos sin excepción, simplemente coloque la anotación directamente en la clase.
No importa el alcance privado / público aquí, pero tenga en cuenta que spring-aop no puede usar el aspecto para las llamadas a métodos en la misma instancia (generalmente las privadas), porque en este caso no usa la clase proxy.
Usamos los consejos de @Around aquí, pero es básicamente la misma sintaxis con @Before, @After o cualquier otro consejo.
Por cierto, la anotación @MyHandling debe configurarse así:
fuente
// perform actions after
no se llamará ya que estamos devolviendo el valor en la línea antes.Puede usar el Interceptor de Monitoreo de Desempeño de Spring y registrar programáticamente el consejo usando un procesador de poste de frijoles.
fuente
De la primavera
AnnotationTransactionAspect
:fuente