Primavera AoP Referencia todos los métodos de todas las clases en cualquier paquete que terminan en una determinada cadena en un punto de corte

user10108359:

Quiero hacer referencia a todos los métodos públicos de todas las clases en cualquier paquete que termina en una determinada cadena en un punto de corte.

Yo he tratado:

@Pointcut("execution(public * *.*SomeString.*(..))")

Editar: Dado que las clases que se desea hacer referencia a todos que vienen desde el contexto de aplicación, sé que puedo hacer esto utilizando frijol ()

@Pointcut("bean(*SomeString)")    

pero yo preferiría ejecución uso ().

kriegaex:

El problema *.*SomeStringes que sólo busca clases en el primer nivel de paquete, tales como foo.BarSomeStringo hello.MySomeString, pero no en sub-paquetes, tales como foo.aaa.bbb.BarSomeStringo hello.xxx.MySomeString.

Si el nombre del paquete es completamente irrelevante, puede utilizar comodines:

execution(public * *..*SomeString.*(..))

Por cierto, si estuviera usando completo AspectJ en lugar de primavera AOP, podría utilizar este acceso directo (no tengo ni idea de por qué la primavera AOP no le gusta, ya que también usa una biblioteca de AspectJ para la coincidencia de punto de corte):

execution(public * *SomeString.*(..))

Si desea definir un backage base y sub-paquete debajo de ella, puede utilizar la ..sintaxis:

execution(public * de.scrum_master..*SomeString.*(..))

Una alternativa a este último sería utilizar within()con el fin de limitar el paquete:

execution(public * *(..)) && within(de.scrum_master..*SomeString)

Por cierto, en AspectJ que realmente necesita el execution()punto de corte, ya que tiene muchos más tipos de punto de corte, pero en la primavera AOP implícitamente a todos los puntos de corte son puntos de corte de ejecución, ya que es el único tipo de puntos de inflexión con el apoyo de la primavera AOP debido a su naturaleza basada en proxy. Por lo que también podría simplemente escribir:

within(de.scrum_master..*SomeString)

De representación basadas en la interfaz de Java (dinámica de proxy) este es el mismo, ya que sólo los métodos públicos son compatibles. La única pequeña diferencia aquí es que para servidores proxy CGLIB (cuando proxy clases, no a las interfaces, o por la configuración para todos los servidores proxy) esto también coincidiría protegido y métodos de paquetes con ámbito.


Un poco fuera de tema, aquí es cómo hacer lo mismo, no para las clases, pero los métodos con un sufijo especial:

execution(public * *SomeString(..))

Si desea limitar también el alcance del paquete / clase que sólo puede combinarlo:

execution(public * *SomeString(..)) && within(de.scrum_master..*)

O equivalente:

execution(public * de.scrum_master..*SomeString(..))

Así que si usted quiere limitar paquete, clase y Mathod nombra a la vez que hace esto:

execution(public * de.scrum_master..*Controller.*SomeString(..))

O equivalente:

execution(public * *SomeString(..)) && within(de.scrum_master..*Controller)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=186847&siteId=1
Recomendado
Clasificación