Red de conocimiento informático - Problemas con los teléfonos móviles - Indicadores de corte de puntos AOP de primavera

Indicadores de corte de puntos AOP de primavera

Spring AOP define aspectos de Spring con la ayuda del lenguaje de expresión pointcut de AspectJ. Los siguientes son los indicadores utilizados en expresiones de punto de corte:

A continuación se ilustrará el uso de cada uno de los indicadores de punto de corte anteriores a través de algunos casos de prueba. Además, dado que la implementación es más común, no se requieren explicaciones adicionales.

Definir una clase de peso de manzana

Definir una clase de manzana roja

Definir una clase de productor de frutas

Clases de prueba utilizadas

SweetFruit implementa la interfaz Fruit. RedApple hereda SweetFruit, implementa la interfaz Origin y está asociada con la interfaz FruitWeight. AppleWeight implementa la interfaz FruitWeight.

Usa el indicador interno para definir la superficie

Caso de prueba

El indicador "interno" se utiliza para limitar el punto de conexión que se ubicará en el tipo definido o paquete y en lo anterior definido en la superficie. Fruit, SweetFruit y RedApple se definen en las caras anteriores. Según los resultados de salida, solo SweetFruit y RedApple se interceptan en las dos caras. Esto significa que el indicador interno solo intercepta tipos específicos, es decir, no tiene nada que ver con la interfaz e intercepta cualquier tipo definido.

Utilice este indicador para definir la superficie

Caso de prueba

Este indicador se utiliza para limitar el punto de conexión a instancias de un tipo determinado (objeto proxy), como aprendiste desde arriba como se ve en el resultado. Como puede ver, sweetFruit.print(); se reemplaza por this(.....Fruit), this(...SweetFruit), redApple.print(); y redApple.printOrigin();, mientras que this( . .. .Fruit), this(... .SweetFruit), this(... .RedApple), this(... .Origin) son interceptados. Esto significa que no importa de qué interfaz o clase se origine el método (redApple.printOrigin(); originado en la interfaz Origin), siempre que la instancia del objeto proxy sea del tipo definido en esto, el método será interceptado. Por ejemplo, los objetos proxy de sweetFruit son instancias de Fruit y SweetFruit. Los objetos proxy de redApple son instancias de Fruit, SweetFruit, RedApple y Origin.

Nota: Mi entorno de prueba muestra que AOP usa el proxy CGLIB, que es un proxy heredado, por lo que el objeto proxy pertenece a la misma interfaz o clase que el objeto proxy anterior.

Casos de prueba

El indicador de destino se utiliza para calificar el punto de unión a una instancia de un tipo determinado (el objeto que se está representando), que es semánticamente similar a este indicador, y luego desde arriba A juzgar por el resultado, parecen ser iguales (excepto que los indicadores son diferentes). Sin embargo, existe una diferencia importante entre ellos: las instancias de this se refieren al objeto proxy, mientras que las instancias de target se refieren al objeto proxy.

Defina facetas utilizando el indicador args La expresión de facetas anterior define un indicador interno adicional, que se utiliza principalmente para limitar el alcance de uso de args. Sin él, Spring AOP intentará representar todos los objetos elegibles, pero el acceso a algunos de ellos estará restringido, lo que provocará que se generen excepciones.

Esto también nos recuerda que cuando utilizamos AOP, debemos especificar claramente el ámbito de uso; de lo contrario, pueden producirse errores imprevistos.

Caso de prueba, revise los tres métodos printPrice definidos previamente:

El indicador args se utiliza para limitar el punto de conexión, es decir, cuando se ejecuta el método, sus parámetros pertenecen al instancia del tipo dado, desde arriba A juzgar por el resultado, solo se intercepta el método public void printPrice(Integer price, String mesg) porque solo cumple las condiciones. Si cambiamos la definición a public void printPrice(String mesg, Integer price), el resultado es el siguiente:

Es decir, el indicador args requiere no solo el tipo de parámetros, sino también el número de parámetros. y el orden en que se definen.

Defina el interruptor usando el indicador @target

Caso de prueba y luego mire la anotación @Validated en la clase RedApple que definió anteriormente:

Ahora elimínela de la anotación @Validated de RedApple y reemplácela con la siguiente anotación:

Ahora elimine la anotación @Validated de RedApple y reemplácela con la siguiente anotación:

Ahora elimine la anotación @Validated de Manzana Roja.

Repita los pasos anteriores y coloque la anotación @Validated en la interfaz de Fruit. El resultado de salida es el siguiente:

@target se usa para limitar el punto de conexión para que forme parte del. clase a la que pertenece el objeto de ejecución (proxy) con las anotaciones dadas. Aunque @target y target tienen nombres similares, su uso es completamente diferente: el primero se usa para anotaciones y el segundo para tipos. Además, como puede ver en el resultado anterior, @target está limitado a la clase del objeto en ejecución, no a su interfaz principal.

Defina la cara que contiene el indicador @within

Pruebe el caso y observe redApple.print(11); definido en la clase SweetFruit

Ahora desde RedApple Quitar; @Anotación validada.

Ahora elimine la anotación @Validated de RedApple y colóquela en SweetFruit. El resultado de salida es el siguiente:

Repita los pasos anteriores y coloque la anotación @Validated en la interfaz de Fruit. El resultado es el siguiente:

@within se utiliza para limitar el punto de conexión al tipo con la anotación dada. Como se puede ver en el resultado anterior, @target apunta a la clase del objeto de ejecución, mientras que @within apunta al tipo de objeto de ejecución. Por ejemplo, redApple.print(); está sobrecargado en la clase RedApple y redApple.print(11); está definido en la clase SweetFruit. Solo si estas dos clases tienen las anotaciones dadas, se interceptará la ejecución del método. . Finalmente, es importante tener en cuenta que @within y inside tienen nombres similares, pero en realidad no son lo mismo.

Utiliza @args para anotar la superficie de definición

Caso de prueba, revisa los métodos definidos en RedApple y la definición de la interfaz FruitWeight:

Ahora elimina la @ Método JsonDeserialize de AppleWeight.

Ahora coloque la anotación @JsonDeserialize en AppleWeight y defina una subclase que herede de AppleWeight:

Caso de prueba

@args se usa para calificar el punto de conexión. el tipo de tiempo de ejecución del parámetro pasado durante la ejecución del método tiene la anotación dada. Según el resultado anterior y la definición de @args, la anotación dada se define según el tipo de parámetro del método en sí o según su clase de implementación. Por ejemplo, RedAppleWeight hereda de AppleWeight (AppleWeight tiene la anotación especificada), pero no especifica la anotación en sí, y cuando FruitWeight tampoco especifica la anotación, los métodos relacionados no serán interceptados.

Definición de caras usando la directiva @annotation

Caso de prueba, revisando la definición de FruitFarmer:

Ahora elimine la anotación @JsonSerialize de print(). El resultado es el siguiente:

@annotation El método utilizado para calificar el punto de unión tiene la anotación dada. Este indicador es fácil de entender, simplemente agregue la anotación dada en el método de destino.

Referencias