JAVA sobre proxy estático y proxy dinámico JDK

Acerca del proxy estático y el proxy dinámico JDK

que es un apoderado

En términos sencillos, un agente es hacer algo en nombre de alguien. Por ejemplo, si un maestro está enfermo y no puede venir a clase hoy, ¿es posible contratar a un maestro interino para ayudar con la clase? En un sentido práctico, el dos maestros Las cosas terminadas son las mismas, son todas para que los estudiantes prediquen y aprendan, pero el maestro interino puede expandir más "funciones" sobre la base de la clase original , por ejemplo, antes de que el maestro interino vaya a la clase, primero va a la siguiente clase para ver. ¿La maestra que me gusta vino de un vistazo, y después de la clase, fui a comer mis fideos de caracol favoritos ~ Al ver aquí, ¿sientes que parece una cosa, entonces el principio de La transformación orientada a aspectos de SpringAOP es así, por supuesto. El aspecto de implementación real es más complicado.

Los agentes se dividen en tres roles.

  1. interfaz
  2. clase delegada
  3. clase de apoderado

proxy estático

Primero hablemos sobre el proxy estático y usemos el ejemplo que dimos anteriormente para cargar directamente el código.

interfaz:

package com.staticproxy;

//我和代理老师都是老师,共同实现了老师接口
public interface Teacher {
    
    
   void teach();
}

Clase delegante:

package com.staticproxy;
//这个就是生病的老师
public class MathTeacher implements Teacher {
    
    
   @Override
   public void teach() {
    
    
       System.out.println("传道受业解惑40分钟");
   }
}

clase de apoderado:

package com.staticproxy;
//这个是代理老师
public class ProxyTeacher implements Teacher {
    
    
   //通过构造器注入被代理对象(注入一个生病老师的对象)
   private Teacher targetTeacher;
   public ProxyTeacher(Teacher teacher){
    
    
       this.targetTeacher=teacher;
   }

   //代理老师实现了接口也有teach方法
   @Override
   public void teach() {
    
    
       System.out.println("上课之前先去隔壁班看美女老师");
       //调用生病老师的teach方法
       targetTeacher.teach();
       System.out.println("上完课了,去吃个螺蛳粉压压惊!");
   }
}

Método principal del cliente:

package com.staticproxy;

public class Client {
    
    
   public static void main(String[] args) {
    
    
       Teacher teacher=new MathTeacher();
       Teacher proxyteacher=new ProxyTeacher(teacher);
       proxyteacher.teach();
   }
}

Resultado:
inserte la descripción de la imagen aquí
el proxy estático debe eliminarse rápidamente, muy simple.
Continuemos con el proxy dinámico, que requiere el mecanismo de reflexión.

Proxy dinámico JDK

interfaz:

package com.jdkproxy;

public interface Teacher {
    
    
   void teach();
}

Nada que decir sobre la misma interfaz que antes.

Clase delegante:

package com.jdkproxy;

public class MathTeacher implements Teacher {
    
    
   @Override
   public void teach() {
    
    
       System.out.println("传道受业解惑40分钟");
   }
}

Aquí viene el punto

package com.jdkproxy;

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

/**
* 注意动态代理这里不需要再实现教师接口了
* 这样才能体现动态的概念,往往在实际应用之中
* 我们是不会提前知道我们需要代理什么对象的
*/
public class ProxyTeacher {
    
    

   private Object targetteacher;
   public ProxyTeacher(Teacher teacher){
    
    
       this.targetteacher=teacher;
   }

/**
* 这里调用了Proxy的newProxyInstance方法获得代理对象
* 参数1表示被代理对象的类加载器
* 参数2是被代理对象实现的接口,可以是数组(表示实现多个接口)
* 参数3是用匿名内部类实例化一个实现了InvocationHandler接口的对象
*/
   public Object getProxyInstance(){
    
    
       return Proxy.newProxyInstance(targetteacher.getClass().getClassLoader(), targetteacher.getClass().getInterfaces(),
               new InvocationHandler() {
    
    
                   /**
                   * @param proxy 调用这个方法的代理实例
    			   * @param method 要调用的方法
    			   * @param args 方法调用时所需要的参数
    			   * @return 方法调用的结果
   				   */
   				   @Override
                   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
                       System.out.println("上课之前先去隔壁班看美女老师");
                       method.invoke(targetteacher,args);
                       System.out.println("上完课了,去吃个螺蛳粉压压惊");
                       return null;
                   }
               });
   }
}

Cliente:

package com.jdkproxy;

public class Client {
    
    
   public static void main(String[] args) {
    
    
       Teacher teacher=new MathTeacher();
       Teacher proxyTeacher=(Teacher)new ProxyTeacher(teacher).getProxyInstance();
       proxyTeacher.teach();
   }
}

Resultado:
inserte la descripción de la imagen aquí
Resumen:
Por supuesto, el proxy dinámico utilizado por SpringAop es más complicado, y otras tecnologías como el proxy dinámico cglib no se extienden aquí. Solo necesitamos saber que el proxy dinámico puede continuar ampliándose e integrándose sobre la base de completar las funciones realizadas por el objeto original. La expansión, que también es una idea importante de la programación orientada a aspectos de SpringAop, se usa ampliamente en funciones como el registro, el manejo de excepciones, el monitoreo y la gestión de transacciones. Este es el principio general de orientación a aspectos. Puedes pensarlo de esta manera. Las clases son un proceso obligatorio para los maestros. En este proceso, las dos funciones de mirar bellezas y comer se cortan horizontalmente, sin afectar la realización de las funciones en absoluto.

Supongo que te gusta

Origin blog.csdn.net/chenyingchuan996/article/details/105254918
Recomendado
Clasificación