[Spring aop] Punto de conexión (Jointpoint), punto de entrada (Pointcut), mejora (Consejo), aspecto / aspecto (Aspecto, Asesor)

Prefacio

El último capítulo "Static Proxy Mode y JDK, CGLIB Dynamic Proxy" analizó el proxy estático y JDK, CGLIB dynamic proxy A continuación, revisaremos algunos conocimientos relacionados con AOP para facilitar el próximo análisis del código fuente de AOP.

1. Primero revisemos algunos términos en AOP

  • Punto de conexión (Jointpoint): expresó la necesidad de insertar una sección transversal en el programa con respecto al punto de extensión, el punto de conexión puede ser el método de ejecución de inicialización de clase, llamadas de método, llamadas de campo o manejar excepciones, etc. , Spring solo admite ejecución del método como punto de conexión , expresado en AOP como "dónde hacerlo";

    Es un recurso que está permitido como punto de entrada, y todos los métodos de todas las clases se pueden usar como puntos de conexión.

  • Pointcut: seleccione un conjunto de patrones de puntos de conexión relacionados, que se pueden considerar como una colección de puntos de conexión. Spring admite expresiones regulares de perl5 y patrones de pointcut de AspectJ. Spring usa la sintaxis de AspectJ por defecto, que se expresa en AOP como "¿Dónde lo haces? "Colección";

    Es para seleccionar algunos puntos de conexión, que pueden ser uno o más. Por ejemplo, hay dos métodos de request () y request2 () en la clase A. Todos los lugares donde se llama a request () de la clase A se pueden seleccionar como el punto de corte.

  • Mejora (aviso): en muchos lugares, se entiende como notificación, pero se entiende como mejora para ser más preciso. Mejora significa el comportamiento realizado en el punto de conexión. Mejora proporciona la necesidad de extender el comportamiento existente en el punto de conexión seleccionado por el punto de entrada en AOP Means; incluida la mejora previa (antes del consejo), la mejora posterior (después del consejo), la mejora del entorno (alrededor del consejo) , en Spring a través del modo proxy para lograr AOP y a través del modo interceptor para rodear el punto de conexión del tejido de la cadena del interceptor Mejora entrante, expresada como "qué hacer" en AOP;

    Incluyendo dos conceptos: uno es elegir el tiempo, puede elegir frontal, posterior o envolvente; el otro es qué hacer: tome el frente como ejemplo, en el método before, se implementará la lógica mejorada por el usuario.

  • Aspecto / Aspecto (también conocido como Asesor): modularización de preocupaciones transversales, como el componente de registro mencionado anteriormente. Se puede considerar como una combinación de mejora, introducción y puntos de entrada; en Spring, Schema y @AspectJ se pueden usar para organización y realización; en AOP, se expresa como "dónde y qué colección";

    Es la combinación de los conceptos anteriores lo que es completo. Por ejemplo, realice operaciones de mejora antes de que se llame al método request () de la clase A. Uno es indispensable, falta el método request () y no sé dónde hacerlo; sin el before (), no sé cuándo realizar la operación de mejora y no sé qué mejorar .


    Asesor = Consejo + Pointcut

  • Declaración entre tipos: la mejora de introducción es una mejora especial. En lugar de entretejer mejoras en torno al método de destino, crea nuevos métodos o atributos para la clase de destino. Por lo tanto, el punto de conexión de la mejora de introducción es a nivel de clase., En lugar de a nivel de método , Spring permite la introducción de una nueva interfaz (que debe corresponder a una implementación) a todos los objetos proxy (objetos de destino), que se expresa en AOP como "qué hacer (qué introducir)";

  • Objeto de destino: el objeto que debe integrarse en las preocupaciones transversales, es decir, el objeto es el objeto seleccionado por el punto de entrada y el objeto que debe mejorarse, que también puede denominarse "objeto mejorado". ; porque Spring AOP usa un proxy El patrón se realiza, de modo que este objeto es siempre un objeto proxy, que se expresa como "a quién" en AOP;

  • Proxy AOP (Proxy AOP): El marco AOP utiliza los objetos creados por el modo proxy para insertar mejoras (es decir, aspectos de la aplicación) en el punto de conexión, que es aplicar aspectos al objeto de destino a través del proxy. En Spring, el proxy AOP se puede implementar con el proxy dinámico JDK o el proxy CGLIB, y el aspecto se aplica a través del modelo de interceptor.

  • Tejido: Tejido es un proceso de aplicación de aspectos a objetos de destino para crear objetos proxy AOP. El tejido se puede realizar durante la compilación, la carga de clases y el tiempo de ejecución.

Los conceptos mencionados anteriormente son relativamente abstractos y aburridos, y el uso de la programación de aspectos en el desarrollo real solo representa una pequeña parte, pero si no comprende los conceptos anteriores, el siguiente análisis del código fuente debe ser nada. Mist, vamos Utilice algunos ejemplos más a continuación para que todos comprendan los conceptos anteriores y se preparen para el análisis del código fuente.

2. Introducción a los métodos de mejora

También hay muchas personas que entienden la mejora como notificación, pero es más preciso entenderla como mejora porque representa el comportamiento realizado en el punto de conexión. Este comportamiento no está disponible en la clase de destino. Agrega métodos adicionales u otros métodos a la clase de destino. Algunas funciones, por lo que se entiende que las mejoras son más adecuadas que las notificaciones. Por supuesto, no importa si algunas personas están acostumbradas al concepto de notificaciones, siempre que sepan que las mejoras en este artículo son notificaciones.

Los tipos de mejora incluyen mejora previa, mejora de retorno posterior, mejora anormal, mejora del entorno, mejora de introducción, mejora posterior a la final, etc. Echemos un vistazo a los ejemplos a continuación. Para brindarle una comprensión más profunda de SpringAop, no explicaremos el camino basado en @AspectJ o los archivos de configuración de Schema al principio, sino que comenzaremos desde lo básico. Después de todo, AOP es En el desarrollo real, no representa una gran proporción, y creo que muchas personas no tienen un conocimiento profundo.

A continuación, primero explicamos las mejoras implementadas en la codificación basada en la interfaz de asesoramiento.

2.1 Mejora previa de MethodBeforeAdvice

Interfaz de destino y clase de implementación:

package com.lyc.cn.v2.day04.advisor;

public interface Animal {
    
    
    void sayHello(String name,int age);
    void sayException(String name,int age);
}
package com.lyc.cn.v2.day04.advisor;

public class Dog implements Animal {
    
    

    @Override
    public void sayHello(String name, int age) {
    
    
        System.out.println("==名字:" + name + " 年龄:" + age);
    }

    @Override
    public void sayException(String name, int age) {
    
    
        System.out.println("==名字:" + name + " 年龄:" + age);
        System.out.println("==抛出异常:" + 1 / 0);
    }
}

MethodBeforeAdvice mejorado previamente:

package com.lyc.cn.v2.day04.advisor;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;

public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
    
    
   
    public void before(Method method, Object[] args, Object target) throws Throwable {
    
    
        System.out.println("==前置增强");
        System.out.println("==方法名:" + method.getName());
        if (null != args && args.length > 0) {
    
    
            for (int i = 0; i < args.length; i++) {
    
    
                System.out.println("==第" + (i + 1) + "参数:" + args[i]);
            }
        }
        System.out.println("==目标类信息:" + target.toString());
    }
}

2.2 Mejora de la publicación AfterReturningAdvice

package com.lyc.cn.v2.day04.advisor;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;

/**
 * 后置增强
 * @author: LiYanChao
 * @create: 2018-11-01 22:09
 */
public class MyAfterReturningAdvice implements AfterReturningAdvice {
    
    
    /**
     * Callback after a given method successfully returned.
     * @param returnValue the value returned by the method, if any
     * @param method      method being invoked
     * @param args        arguments to the method
     * @param target      target of the method invocation. May be {@code null}.
     * @throws Throwable if this object wishes to abort the call.
     *                   Any exception thrown will be returned to the caller if it's
     *                   allowed by the method signature. Otherwise the exception
     *                   will be wrapped as a runtime exception.
     */
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
    
    
        System.out.println("==后置增强");
        System.out.println("==方法名:" + method.getName());
        if (null != args && args.length > 0) {
    
    
            for (int i = 0; i < args.length; i++) {
    
    
                System.out.println("==第" + (i + 1) + "参数:" + args[i]);
            }
        }
        System.out.println("==目标类信息:" + target.toString());
    }
}

2.3 Mejora de la excepción ThrowsAdvice

package com.lyc.cn.v2.day04.advisor;
import org.springframework.aop.ThrowsAdvice;
import java.lang.reflect.Method;

/**
 * @author: LiYanChao
 * @create: 2018-11-01 22:17
 */
public class MyThrowsAdvice implements ThrowsAdvice {
    
    

    /**
     * 异常增强
     */
    public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {
    
    
        System.out.println("==异常增强");
        System.out.println("==方法名:" + method.getName());
        if (null != args && args.length > 0) {
    
    
            for (int i = 0; i < args.length; i++) {
    
    
                System.out.println("==第" + (i + 1) + "参数:" + args[i]);
            }
        }
        System.out.println("==目标类信息:" + target.toString());
        System.out.println("==异常信息:" + ex.toString());
    }
}

2.4 Método Mejora del sonido envolvente del interceptor

package com.lyc.cn.v2.day04.advisor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 环绕增强
 * @author: LiYanChao
 * @create: 2018-11-01 22:29
 */
public class MyMethodInterceptor implements MethodInterceptor {
    
    

    /**
     * 环绕增强 这里的方法参数与之前的前置增强、后置增强明显不同,只有一个MethodInvocation类型的参数
     * Implement this method to perform extra treatments before and
     * after the invocation. Polite implementations would certainly
     * like to invoke {@link Joinpoint#proceed()}.
     * @param invocation the method invocation joinpoint
     * @return the result of the call to {@link Joinpoint#proceed()};
     * might be intercepted by the interceptor
     * @throws Throwable if the interceptors or the target object
     *                   throws an exception
     */
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
    
    
        System.out.println("==环绕增强开始");
        System.out.println("==方法名:" + invocation.getMethod().getName());
        Object[] args = invocation.getArguments();
        if (null != args && args.length > 0) {
    
    
            for (int i = 0; i < args.length; i++) {
    
    
                System.out.println("==第" + (i + 1) + "参数:" + args[i]);
            }
        }

        Object proceed = invocation.proceed();

        System.out.println("==环绕增强结束");
        return proceed;
    }
}

2.5 Resultados de la ejecución

@Test
public void test5() {
    
    
    // 前置增强
    // 1、实例化bean和增强
    Animal dog = new Dog();
    MyMethodBeforeAdvice advice = new MyMethodBeforeAdvice();

    // 2、创建ProxyFactory并设置代理目标和增强
    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.setTarget(dog);
    proxyFactory.addAdvice(advice);

    // 3、生成代理实例
    Animal proxyDog = (Animal) proxyFactory.getProxy();
    proxyDog.sayHello("二哈", 3);
}


@Test
public void test6() {
    
    
    // 后置增强
    // 1、实例化bean和增强
    Animal dog = new Dog();
    MyAfterReturningAdvice advice = new MyAfterReturningAdvice();

    // 2、创建ProxyFactory并设置代理目标和增强
    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.setTarget(dog);
    proxyFactory.addAdvice(advice);

    // 3、生成代理实例
    Animal proxyDog = (Animal) proxyFactory.getProxy();
    proxyDog.sayHello("二哈", 3);

}

@Test
public void test7() {
    
    
    // 异常增强
    // 1、实例化bean和增强
    Animal dog = new Dog();
    MyThrowsAdvice advice = new MyThrowsAdvice();

    // 2、创建ProxyFactory并设置代理目标和增强
    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.setTarget(dog);
    proxyFactory.addAdvice(advice);

    // 3、生成代理实例
    Animal proxyDog = (Animal) proxyFactory.getProxy();
    proxyDog.sayException("二哈", 3);

}


@Test
public void test8() {
    
    
    // 环绕增强
    // 1、实例化bean和增强
    Animal dog = new Dog();
    MyMethodInterceptor advice = new MyMethodInterceptor();

    // 2、创建ProxyFactory并设置代理目标和增强
    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.setTarget(dog);
    proxyFactory.addAdvice(advice);

    // 3、生成代理实例
    Animal proxyDog = (Animal) proxyFactory.getProxy();
    proxyDog.sayHello("二哈", 3);

}

3. Resumen

Lo anterior introduce brevemente la implementación de codificación de pre-mejora, post-mejora, mejora del entorno y mejora anormal Por supuesto, la implementación anterior también se puede implementar a través de archivos de configuración.

Los puntos de conocimiento introducidos en este artículo son relativamente simples, pero comprender el concepto de mejora es la base de AOP. De hecho, los diversos métodos de mejora de este artículo se pueden implementar con el proxy dinámico explicado en el artículo anterior, porque la fábrica de agentes lo que se usa en este artículo es ProxyFactoryinterno Lo que se usa es CglibAopProxyo JdkDynamicAopProxy, de hecho, su esencia sigue siendo el proxy dinámico JDK o CGLIB. En los siguientes capítulos se explicará en detalle la implementación de CglibAopProxy o JdkDynamicAopProxy. El análisis de este artículo está aquí.


referencia:

"Revisión de los puntos de conocimiento 28-Aop e implementación mejorada basada en la interfaz de asesoramiento"

Supongo que te gusta

Origin blog.csdn.net/m0_45406092/article/details/115243643
Recomendado
Clasificación