Programación detallada de aspectos Aop

1. ¿Qué es la programación orientada a aspectos (aop) y sus escenarios de aplicación?
En comparación con la programación orientada a objetos (oop), la unidad central de modularización en oop es la clase, mientras que la unidad central de aop es el aspecto. Los aspectos permiten realizar la modularización de preocupaciones como la gestión de transacciones. Como la gestión de transacciones en varios tipos y objetos. Verificación del token de inicio de sesión, verificación del permiso de ejecución del método (control de acceso), detección del rendimiento, gestión de transacciones, registro, etc.
2. Terminología de la programación de
aspectos . Aspecto (Aspetct): La relación entre el punto de contacto y la notificación se denomina
punto de unión (Join Point)):. Todos los métodos de la clase son puntos de conexión.
punto de corte: métodos que carecen de códigos funcionales comunes (el punto de entrada debe ser el punto de conexión, y el punto de conexión no es necesariamente el punto de entrada)
Advice (algunas personas mejora de llamada): Defina lo que quiere hacer el aspecto y la lógica de código común que se extraerá. (Las notificaciones se distinguen por ubicación)
    Antes de la notificación (antes),
    después de la notificación (después),
    notificación de devolución (después de la devolución),
    notificación anormal (después del lanzamiento),
    alrededor de la notificación (alrededor)
introducción (Introducción): las notificaciones solo pueden extraer información común códigos lógicos, las variables no se pueden extraer. Si necesita introducir variables en el método pointcut, debe utilizar la introducción. El mecanismo de introducción puede ser agregar variables miembro adicionales o métodos miembro a la clase. El mecanismo de introducción se completa durante el período de carga del compilador o de la clase. (Comprender)
Objeto de destino: el objeto que carece del código común, es decir, el objeto que está separado del código común (el objeto de destino está incompleto)
Objeto de proxy (AOP Proxy): El objeto de destino de proxy.
Tejido: en el punto de entrada, el objeto proxy teje la notificación en el objeto de destino, que es una acción (springAop se teje en tiempo de ejecución)
3. La solución y configuración relevante de la programación de aspectos
@Aspect define el aspecto
@Pointcut define el nombre pointcut
    expresión pointcut: ejecución (* cn.tedu.store.service.impl * * ( ..) ..) && args (*)
            el primero *: devuelve cualquier tipo
            segundo *: clase
            tercero A *: El método en la clase . El
            cuarto (..): El método recibe cualquier tipo de parámetro. El
            quinto *: La
              ejecución del parámetro especificado ([modificador de control de acceso al método] Nombre del paquete del valor de retorno del método. Nombre de la clase / Nombre de la interfaz. Nombre del método (parámetro)) 
              Nota : El modificador de control de acceso del método se puede omitir y el nombre del paquete y el nombre de la clase deben incluirse al escribir el nombre del método.
@Before define la notificación antes de que se ejecute el método (escenario de aplicación: verificación)
@After define la notificación después de que se ejecuta el método (escenario de aplicación: limpiar el sitio, liberar recursos)
@AfterReturning define la notificación después de que se devuelve el resultado de ejecución del método (escenario de aplicación: procesamiento de datos regular)
@AfterThrowing Defina la notificación después de que se lanza una excepción en la ejecución del método (escenario de aplicación: manejo de excepciones)
@Around puede realizar una notificación antes y después del método de destino (escenario de aplicación: muy poderoso, usted poder hacer cualquier cosa)
 


4. Caso
4.1 Formas de obtener los parámetros del método objetivo del aspecto: El
primer método: obtener a través del método JoinPoint.getArgs () de JoinPoint, que es la clase padre de ProceedingJoinPoint.
El segundo tipo: agregue && args (*) a través de la expresión del punto de entrada (el acoplamiento es demasiado alto, no se recomienda)

4.2. Obtenga los parámetros del método de destino y páselos al método de destino después de la modificación. Solo se puede usar ProceedingJoinPoint, y solo se puede usar el método de notificación de entorno.

4.3. Formas de obtener el valor de retorno del aspecto: el
primero: @AfterReturning (valor = "pointCut ()", return = "res") (el retorno se puede personalizar, pero debe ser consistente con el nombre del parámetro del método del anotación, que es Object res)
El segundo tipo: use la notificación alrededor, el valor de retorno del método ProceedingJoinPoint.proceed () es el valor de retorno del método de destino (nota: cuando ProceedingJoinPoint devuelve el valor de retorno del objeto de destino, el el tipo de método de retorno debe ser coherente con el tipo de retorno del método de destino)

4.4. El método para obtener la información de excepción de lanzamiento del 
 aspecto: @AfterThrowing (value = "pointCut ()", throwing = "e") (el lanzamiento se puede personalizar, pero debe ser coherente con el nombre del parámetro del método de anotación, que es arrojable e)


5. Aop proxy
Aop proxy se divide en proxy estático y proxy dinámico. El representante de proxy estático es AspectJ, y el representante de proxy dinámico es springAop.
El llamado proxy dinámico significa que el marco aop no modifica el código de bytes, sino que genera temporalmente un objeto Aop para el método en la memoria (podemos llamarlo un "objeto proxy"), este objeto Aop contiene todo el objeto de destino Método y procesamiento mejorado en un punto de contacto específico y métodos de devolución de llamada del objeto original.

Hay dos formas principales de proxy dinámico en springAop: proxy dinámico JDK y proxy dinámico CGLIB
5.1 El proxy dinámico JDK es una clase que recibe proxy a través de la reflexión y requiere que la clase de proxy implemente una interfaz. El núcleo del proxy dinámico JDK es la interfaz IncocationHandler y la clase Proxy. Ahora todos somos programación orientada a interfaces, y los proyectos que hacemos son todo tipo de interfaces + clases de implementación. Por lo tanto, hay interfaces y clases de implementación en un proyecto de Spring. Si no están configuradas especialmente en el archivo de configuración de Spring (es decir, se usa la configuración predeterminada), el método de proxy predeterminado es el proxy dinámico JDK. Pero si la clase de destino no implementa la interfaz, springAOP elegirá usar CGLIB para alimentar dinámicamente la clase de destino.

5.2 CGLIB (Code Generation Library) es una biblioteca de clases para la generación de código, que puede generar dinámicamente una subclase de una determinada clase en tiempo de ejecución, es decir, después de la compilación, modificando el bytecode, se genera un nuevo objeto proxy proxyObj. Tenga en cuenta que CGLIB es un proxy dinámico por herencia. Por lo tanto, si una clase se marca como final, no puede usar CGLIB como proxy dinámico.


Ejemplo:
proxy dinámico JDK:
la clase de destino (clase de implementación) se puede considerar como el chef Zhang San, y Zhang San puede implementar todas las funciones de la interfaz. Por ejemplo, el jefe puede dejar que Zhang San cocine. Cuando sea un agente, lo hará implementarse de acuerdo con Zhang San. Cree un Zhang San A (objeto de agente) como avatar de Zhang San. En este momento, Zhang San y Zhang San A tienen la misma interfaz (encarnación dinámica), y los dos se ven exactamente iguales. tiempo, Zhang San A puede lavar los platos antes de que Zhang San cocine, y luego el propio Zhang San cocinará. Pero a los ojos del jefe (la persona que llama), solo Zhang San (la clase objetivo) estaba lavando verduras y cocinando de principio a fin. Pero Zhang San (clase objetivo) sabe que su sustituto lo ayudó a hacer algunas cosas antes de que comenzara a cocinar y, de manera similar, el sustituto puede ayudarlo a lavar los platos después de que él mismo prepare la cena.
Por lo tanto, si la clase de destino no implementa la interfaz, el programa no puede implementar un objeto proxy basado en la interfaz y no puede reemplazar la clase de destino (clase de implementación) para hacer algo. Este método de proxy es efectivo solo cuando se llama al método a través de la interfaz.

Agencia dinámica CGLIB:
comparamos la analogía objetivo con Li Gang. Al actuar, el programa creará una subclase basada en Li Gang para heredar la clase objetivo. Entonces esta subclase es el objeto proxy (el hijo de Li Gang), por lo que el hijo de Li Gang puede reemplazar a su papá. Dinero (porque su papá es Li Gang, jaja), debido al polimorfismo, el programa no puede reconocerlo, y luego, cuando la clase objetivo está haciendo cosas por los demás, a los ojos de los forasteros, es Li Gang que está recolectando dinero para hacer cosas. Pero Li Gang tiene muchos privilegios. Su hijo no tiene autoridad, es decir, hay métodos finales en la clase de destino y las subclases no pueden heredar, por lo que el objeto proxy no puede representar esta parte de la función. (Es lógico que el método de modificación final se pueda heredar, pero no se puede anular. Se dice que CDLIB no puede representar esta parte de la función de la clase principal. Adivina: De hecho, el método de modificación final se puede heredar, pero no se puede anular. Es decir, no se puede subclasificar de forma concreta. Em se puede entender como otros métodos se pueden reescribir directamente, y luego se pueden realizar mejoras de pointcut a través del método reescrito, y se volverá a llamar proce () cuando el método de la clase de destino se ejecuta. Por lo tanto, es final El método no puede encontrar un punto de entrada, por lo que, naturalmente, no se puede mejorar).


Desarrollar AOP basado en anotaciones:
La orden de ejecución entre las diferentes anotaciones es fijo:
una vuelta antes de
antes de
alrededor después de
después de
afterReturning

El orden de ejecución entre las mismas anotaciones no es fijo y se ve afectado por el nombre del método y la posición, por lo que si el programa está relacionado con el orden de ejecución, se recomienda utilizar la configuración xml

La premisa del proxy dinámico JDK es que se debe implementar la interfaz del
proxy dinámico jdk, de hecho, el método newProxyInstance de la clase java.lang.reflect.Proxy se utiliza para implementar el proxy dinámico.

Similar a heredar el
proxy dinámico CGLIB: el nombre completo (Biblioteca de generación de código), es una biblioteca de clases para la generación de código, que puede generar dinámicamente objetos de
código de bytes . CGLIB implementa pasos de proxy dinámico:
1. Genere un objeto de código de  bytes (vacío) de la nada. air
2. Configuración La clase principal del objeto de código de bytes es el objeto de destino
3. Los métodos de devolución de llamada se realizan a través del objeto de código de bytes generado, y el método de destino se mejora durante el proceso de devolución de llamada (mejora de las funciones del método)
4. Crear objeto proxy (completar proxy dinámico)
llamada La función de método del objeto proxy se ha mejorado

CGLIB es un tercero, pero se ha integrado en el paquete jar principal de Spring.

Proxy dinámico JDK (agente para objetos)
Proxy dinámico CGLIB (agente para código de bytes (clase))

idea Ver las teclas de método abreviado de la subinterfaz o clase de implementación de una interfaz:
primero seleccione la clase o interfaz y luego presione Ctrl + h
 

 

Supongo que te gusta

Origin blog.csdn.net/D_J1224/article/details/108362494
Recomendado
Clasificación