English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Dominar fácilmente el patrón de proxy de Java

Hablemos juntos sobre el patrón de proxy Java

1、proxy estático

1.1El proxy de la proxy estática y la clase proxyada deben mantener una interfaz común. 

public interface IUserDao {
  void save();
} 

1.2La clase que se proxya, el objeto de destino 

public class UserDao implements IUserDao{
  @Override
  public void save() {
    System.out.println("-----¡Los datos se han guardado con éxito!!!------");
  }
} 

1.3Objeto agente 

public class UserDaoProxy implements IUserDao{
  // Recibir el objeto de destino para guardar
  private IUserDao target;
  public UserDaoProxy(IUserDao target) {
    this.target = target;
  }
  @Override
  public void save() {
    System.out.println("Inicio de transacción...");
    target.save();       // Ejecutar el método del objeto objetivo
    System.out.println("Presentar transacción...");
  }
}

1.4Clase de prueba 

public class App {
  public static void main(String[] args) {
    // Objeto objetivo
    IUserDao target = new UserDao();
    // Proxy
    IUserDao proxy = new UserDaoProxy(target);
    proxy.save(); // Ejecuta es, el método del proxy
  }
}

2、proxy dinámico

2.1Del mismo modo, el proxy dinámico también necesita completar una interfaz. (Igual que antes)

2.2El objeto de destino también es el mismo.

2.3Sólo hay diferencias en el objeto proxy 

public class ProxyFactory {
  // Mantener un objeto de destino
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // Crear objeto proxy para el objeto de destino 
  public Object getProxyInstance() {
    return Proxy.newProxyInstance(
        target.getClass().getClassLoader(), 
        target.getClass().getInterfaces(),
        new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable {
            System.out.println("Abrir transacción");
            // ejecutar método del objeto de destino
            Object returnValue = method.invoke(target, args);  
            System.out.println("Enviar transacción");
            return returnValue;
          }
        });
  }
}

2.4Clase de prueba 

public class App {
  public static void main(String[] args) {
    // Objeto objetivo
    IUserDao target = new UserDao();
    System.out.println(target.getClass());
    // Crear objeto proxy para el objeto de destino
    IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // ejecutar método  【objeto proxy】
    proxy.save();
  }
}

3y proxy cglib

3.1El proxy cglib no necesita completar la interfaz, solo se necesita escribir la clase del objeto que se proxya y la clase del proxy, aquí la clase del objeto que se proxya es la misma1.2,por lo tanto, no se escribe.

3.2La clase de proxy es diferente, para usar el patrón de proxy cglib se necesita referenciar el paquete del framework central de spring. 

public class ProxyFactory implements MethodInterceptor{
  // mantener objeto de destino
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // Crear objeto proxy para el objeto de destino
  public Object getProxyInstance(){
    //1. clase de herramienta
    Enhancer en = new Enhancer();
    //2. establecer clase padre
    en.setSuperclass(target.getClass());
    //3. establecer función de retroalimentación
    en.setCallback(this);
    //4. crear subclase (objeto proxy)
    return en.create();
  }
  @Override
  public Object intercept(Object obj, Method method, Object[] args,
      MethodProxy proxy) throws Throwable {}}
    System.out.println("Inicio de transacción.....");
    // Ejecutar el método del objeto objetivo
    Object returnValue = method.invoke(target, args);
    System.out.println("Enviar transacción.....");
    return returnValue;
  }
}

3.3Clase de prueba 

public class App {
  public static void main(String[] args) {
    // Objeto objetivo
    UserDao target = new UserDao();
    System.out.println(target.getClass());
    // Objeto agente
    UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // Ejecutar el método del objeto agente
    proxy.save();
  }
}

Este es el contenido completo del artículo. Espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de clamor.

Declaración: el contenido de este artículo se ha obtenido de la red, pertenece al propietario original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relevante. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará