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 que esté 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();, this( .. .Fruit), this(... .SweetFruit), this(... .RedApple) y this(... .Origin) son interceptados. Esto significa que no importa de qué interfaz o clase se origine el método (redApple.printOrigin(); se origina 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 llame a la anotación @Validated en la clase RedApple previamente definida:
Ahora elimine el @ de RedApple Anotación validada y agregue esta anotación a RedApple:
Ahora elimine la anotación @Validated de RedApple y agregue esta anotación a RedApple. Agregue la anotación @Validated en RedApple y colóquela en SweetFruit. El resultado de salida es el siguiente:
Repita los pasos anteriores y agregue la anotación @Validated en la interfaz de Fruit. /p>
@target se utiliza para calificar el punto de conexión para que pertenezca a la clase del objeto de ejecución (objeto proxy) con la anotación dada. 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 que redApple.print(11) está definido en la clase SweetFruit
Ahora desde RedApple Elimina la anotación @Validated.
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 no especifica la anotación, el método relacionado no será interceptado.
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 proporcionada en el método de destino.
Referencias