Aprendizaje del marco Spring5-Aop

Este artículo ha participado en el evento "Ceremonia de creación de recién llegados" para comenzar juntos el camino de la creación de oro.

Aprendizaje del marco Spring5-Aop

En el aprendizaje del artículo anterior, ya hay algunos paquetes de guías e instrucciones para crear proyectos relacionados. Puede consultar este artículo de aprendizaje básico de Spring.

1. ¿Qué es AOP?

AOP (Programación Orientada a Aspectos) significa: Programación orientada a aspectos, una tecnología que logra el mantenimiento unificado de las funciones del programa a través de agentes dinámicos de precompilación y tiempo de ejecución. AOP es la continuación de OOP, un punto caliente en el desarrollo de software y una parte importante del marco Spring.Es un paradigma derivado de la programación funcional. El uso de AOP puede aislar cada parte de la lógica comercial, reduciendo así el acoplamiento entre cada parte de la lógica comercial, mejorando la reutilización del programa y mejorando la eficiencia del desarrollo.

foto.png

2. El papel de AOP en Spring

Proporciona transacciones declarativas; permite aspectos definidos por el usuario

  • Preocupaciones transversales: métodos o funciones que abarcan múltiples módulos de una aplicación. Es decir, la parte que no tiene que ver con nuestra lógica de negocio, pero a la que debemos prestar atención, es la transversal. Tales como registro, seguridad, almacenamiento en caché, transacciones, etc.
  • ASPECTO: Un objeto especial cuyas preocupaciones transversales se modularizan. Es decir, es una clase.
  • Consejo: El trabajo que debe hacer el aspecto. Es decir, es un método en la clase.
  • Target (Target): el objeto notificado.
  • Proxy: un objeto creado después de aplicar una notificación al objeto de destino.
  • Pointcut (PointCut): La definición del "lugar" donde se ejecuta la notificación de aspecto.
  • JointPoint: el punto de ejecución que coincide con el punto de corte.

foto.png

En Spring AOP, la lógica transversal se define a través de Advice.Spring admite 5 tipos de Advice:

  • Pre-Notificación -- Antes del método
  • Publicar notificación -- después del método
  • Notificaciones circundantes: métodos antes y después
  • Notificación de lanzamiento de excepción: el método lanza una excepción
  • Introducción a los consejos: el último consejo de la clase, finalmente

Es decir, agregar nuevas funciones sin cambiar el código original en Aop

3. Capa inferior AOP

Breve descripción: Agregue nuevas funciones a la función principal sin modificar el código fuente

1. La capa inferior de AOP utiliza un proxy dinámico

1. Hay una interfaz que usa un proxy dinámico JDK

  • Cree una interfaz para implementar un objeto proxy y mejorar el método de la clase

foto.png

  • Sin interfaz para usar el proxy dinámico CGLIB

Cree un objeto proxy de la subclase para mejorar el método de la clase

foto.png

2. AOP (proxy dinámico JDK)

1. Use el objeto proxy dinámico JDK y use los métodos en la clase Proxy para crear el objeto proxy

foto.pngLlame al método newProxyInstance

foto.png

Los tres parámetros del método.

  • cargador -- cargador de clases
  • Interfaz de clase: la interfaz implementada por la clase donde se encuentra el método de mejora, esto admite múltiples interfaces
  • InvocationHandler implementa esta interfaz, crea objetos proxy y escribe métodos mejorados

2. El código de proxy dinámico JDK implementa la interfaz de creación

package com.Spring.AOp;

public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}

复制代码

método de implementación de la interfaz

package com.Spring.AOp;

public class UserDaoImpl implements UserDao {
    @Override
    public int add(int a, int b) {
        System.out.println("add 方法执行");
        return a+b;
    }

    @Override
    public String update(String id) {
        System.out.println("update方法执行");
        return id;
    }
}

复制代码

Cree una clase Proxy para implementar el objeto proxy de interfaz

package com.Spring.AOp;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class JDKProxy {
    public static void main(String[] args) {
        Class[] interfaces = {UserDao.class};
//            Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), new InvocationHandler() {
//                @Override
//                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                    return null;
//
//            });
//
//                    }
        UserDaoImpl userDao = new UserDaoImpl();
        UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces, new UserDaoProxy(userDao));
        int result = dao.add(1,2);
        System.out.println("result"+result);
    }
                        //创建接口实现类代理对象
}
//代理对象代码
 class UserDaoProxy implements InvocationHandler {
    //将创建的代理对象,传入
    private Object obj;
    public UserDaoProxy(Object obj){
        this.obj = obj;
    }
    //增强的逻辑
     @Override
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前执行
         System.out.println("方法之前执行..."+method.getName()+"传递的参数"+ Arrays.toString(args));
        //被增强的方法执行
         Object res =  method.invoke(obj,args);
        //方法之后执行
         System.out.println("方法之后执行.."+obj);
        return res;
     }
 }
复制代码

Supongo que te gusta

Origin juejin.im/post/7084892844007096357
Recomendado
Clasificación