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:
-
interfaz
public interface Rent { public void rent(); }
-
Carácter real (propietario)
public class Host implements Rent{ public void rent() { System.out.println("房东有房子出租"); } }
-
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("收取中介费"); } }
-
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:
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
InvocationHandler
Es 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
invoke
método de su controlador de llamadas . -
Proxy
Proporciona 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