[9] Modelo de agencia [Mejor comprensión de AOP]

10. Modo de agencia

¿Por qué aprender el modelo de agencia?

Debido a que esta es la capa inferior de SpringAOP, [el desarrollo del lado del servidor SpringAOP y la entrevista de SpringMVC deben preguntar]

Clasificación del modo de agente:

  • Proxy estático
  • Proxy dinámico

10.1 Proxy estático

Análisis de roles:

  • Rol abstracto: generalmente usa interfaces o clases abstractas para resolver
  • Rol real: el rol del agente
  • Rol de actuación: Actuando para el rol real, después de actuar para el rol real, generalmente hacemos algunas operaciones subsidiarias.
  • Cliente: ¡La persona que visita el objeto proxy!

paso:

  1. interfaz

    public interface Rent {
          
          
    
        public void rent();
    }
    
  2. Carácter real (propietario)

    public class Host implements Rent{
          
          
        public void rent() {
          
          
            System.out.println("房东有房子出租");
        }
    }
    
  3. Rol de agente

    public class Proxy implements Rent{
          
          
    
        private Host host;
    
        public Proxy() {
          
          
    
        }
    
        public Proxy(Host host) {
          
          
            this.host = host;
        }
    
        public void rent() {
          
          
            host.rent();
            viewHouse();
            contract();
            fee();
        }
    
        public void viewHouse(){
          
          
            System.out.println("中介带租客去看房子");
        }
    
        public void contract(){
          
          
            System.out.println("中介负责打印合同签合同");
        }
    
        public void fee(){
          
          
            System.out.println("收取中介费");
        }
    }
    
  4. Rol de agente de acceso al cliente

    public class Client {
          
          
    
        public static void main(String[] args) {
          
          
            Host host = new Host();
    
            Proxy proxy = new Proxy(host);
            proxy.rent();
        }
    }
    

Beneficios del modelo de agencia:

  • ¡Puede hacer que el funcionamiento de personajes reales sea más puro! No es necesario prestar atención a algunos asuntos públicos.
  • ¡Los asuntos públicos se dejan en manos del agente! Darse cuenta de la división del trabajo
  • Cuando el negocio público se expande, es conveniente para la administración centralizada.

Desventajas:

  • Un rol real producirá un rol de agente; la cantidad de código se duplicará y la eficiencia del desarrollo será menor

10.2 Profundizar la comprensión

Hablar de AOP:

Inserte la descripción de la imagen aquí

10.3, proxy dinámico

  • Los agentes dinámicos tienen el mismo rol que los agentes estáticos

  • La clase de proxy de proxy dinámico se genera dinámicamente, no la escribimos directamente nosotros.

  • Los agentes dinámicos se dividen en dos categorías: agentes dinámicos basados ​​en interfaz y agentes dinámicos basados ​​en clases

    • Basado en la interfaz: proxy dinámico JDK
    • Basado en la clase: cglib
    • Implementación de código de bytes de Java: javasist
  • interfaz pública InvocationHandler

    InvocationHandlerEs una interfaz implementada por el controlador de llamadas de la instancia de proxy .

    Cada instancia de agente tiene un administrador de llamadas asociado. Cuando se llama a un método en una instancia de proxy, la llamada al método se codificará y se enviará al invokemétodo de su controlador de llamadas .

  • ProxyProporciona métodos estáticos para crear instancias y clases de proxy dinámicos También es la superclase de todas las clases de proxy dinámicas creadas por estos métodos.

Caso de agencia:

1. Interfaz

package com.kuber.dynamicdemo1;

public interface UserService {
    
    
    public void add();
    public void delete();
    public void update();
    public void query();
}

2. Personajes reales

package com.kuber.dynamicdemo1;



public class UserServiceImpl implements UserService {
    
    
    public void add() {
    
    
        System.out.println("执行add方法");
    }

    public void delete() {
    
    
        System.out.println("执行delete方法");
    }

    public void update() {
    
    
        System.out.println("执行update方法");
    }

    public void query() {
    
    
        System.out.println("执行了query方法");
    }
}

3. Función interina

package com.kuber.dynamicdemo1;

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

public class ProxyInvocationHandler implements InvocationHandler {
    
    
    /*被代理的接口*/
    private Object target;

    public void setTarget(Object target) {
    
    
        this.target = target;
    }

    /*生成得到代理类*/
    public Object getProxy(){
    
    
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
    }

    /*处理代理实例,并返回结果*/
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
        log(method.getName());
        Object result = method.invoke(target, args);
        return result;
    }

    public void log(String msg){
    
    
        System.out.println("【日志】"+msg+"方法执行");
    }
}

4. Función del agente de acceso del cliente

package com.kuber.dynamicdemo1;

public class Client {
    
    

    public static void main(String[] args) {
    
    

        /*真实角色*/
        UserServiceImpl userService = new UserServiceImpl();

        /*代理角色*/
        ProxyInvocationHandler pih = new ProxyInvocationHandler();

        /*设置要代理的对象*/
        pih.setTarget(userService);

        /*动态代理生成类*/
        UserService proxy = (UserService)pih.getProxy();
        proxy.query();
    }
}

Los beneficios de los agentes dinámicos:

  • ¡Puede hacer que el funcionamiento de personajes reales sea más puro! No es necesario prestar atención a algunos asuntos públicos.
  • ¡Los asuntos públicos se dejan en manos del agente! Darse cuenta de la división del trabajo
  • Cuando el negocio público se expande, es conveniente para la administración centralizada.
  • Un proxy de clase de proxy dinámico es una interfaz, generalmente un tipo de negocio correspondiente
  • Una clase de proxy dinámico puede proxy de varias clases, siempre que se implemente la misma interfaz

Supongo que te gusta

Origin blog.csdn.net/weixin_43215322/article/details/110353424
Recomendado
Clasificación