Directorio de artículos
Mecanismo de proxy dinámico
API proporcionada por MyBatis tradicional
No se puede comprobar el parámetro ID de declaración pasado.
Interfaz del mapeador
Usando la interfaz Mapper, MyBatis abstrae cada elemento <mapper> en el archivo de configuración como una interfaz Mapper, y el método declarado en esta interfaz corresponde al elemento hijo <select | update | delete | insert> en el elemento <mapper>
Existe una correspondencia uno a uno entre las interfaces izquierda y derecha y el id.
Proxy estático y proxy dinámico
Distinguir la clave: si estas tres entidades existen en la etapa de operación del programa
A la izquierda está la entidad de destino, a la derecha está la entidad del agente y en la parte superior está la interfaz.
Las dos entidades siguientes deben implementar la interfaz anterior. La
entidad proxy puede ampliar la entidad real
Proxy estático
Una interfaz para entregar la tarea
Dos clases de implementación, el estudiante y el
líder de la clase . El líder de la clase tiene a los estudiantes como parámetros. La
clase de prueba se usa para crear una instancia del líder de la clase y el estudiante y asignar valores, y para implementar el método de ver las correcciones de la tarea por llamando a los atributos del líder de la clase.
Estructura del proyecto
Líder de la clase Master.java
package com.mybatis.demo;
//代理类
public class Master implements Submitted{
private Student student;
//实现抽象方法
@Override
public void submitHomework() {
student.submitHomework();
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
Student.java clase de estudiantes
package com.mybatis.demo;
//被代理类
public class Student implements Submitted{
private String name;
//实现接口的方法
@Override
public void submitHomework() {
System.out.println(name+"交作业");
}
//get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Necesita implementar la interfaz
package com.mybatis.demo;
public interface Submitted {
//代理类与被代理类都需要实现的接口
public void submitHomework();
}
Clase de prueba Test.java
package com.mybatis.demo;
public class Test {
public static void main(String[] args) {
Master master=new Master();
Student student=new Student();
student.setName("九爷");
master.setStudent(student);
fun(master);
}
//参数是接口,只要实现了接口,具体对象是谁无所谓
public static void fun(Submitted sub) {
sub.submitHomework();
}
}
La parte superior izquierda es la clase de proxy y la interfaz que
la clase de proxy necesita implementar. La parte inferior es una clase, que necesita que definamos
Proxy dinámico
Estructura del proyecto
MyInvocationHandler.java
package com.mybatis.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler<T> implements InvocationHandler {
//被代理对象的类型,接口的类型,通用的T类型
T obj;
//重写此方法
//动态代理的核心
//代理类中,每个方法被调用时候都会执行此方法
//参数1:动态代理对象
//参数2:正在执行的方法
//参数3:是参数2的传入的实际参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//通过反射执行代理类的方法
//参数1:需要被执行的方法,参数2:实际参数
Object result = method.invoke(obj, args);
//可以对代理的那个方法进行扩展
System.out.println("这是方法的扩展");
return null;
}
//封装出现代理类对象的方法
public T createProxySubject() {
//生成代理实例
//参数1:类加载器
//参数2:class数组,参数类需要实现的接口类型
//参数3:InvocationHandler类型
return (T) Proxy.newProxyInstance(Student.class.getClassLoader(),
new Class[] {
Submitted.class},
this);
}
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
Clase de proxy Student.java
package com.mybatis.demo;
//被代理类
public class Student implements Submitted{
private String name;
//实现接口的方法
@Override
public void submitHomework() {
System.out.println(name+"交作业");
}
//get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Clases de interfaz enviadas.java que deben implementarse
package com.mybatis.demo;
public interface Submitted {
//代理类与被代理类都需要实现的接口
public void submitHomework();
}
Clase de prueba Test.java
package com.mybatis.demo;
public class Test {
public static void main(String[] args) {
//动态代理
Student s=new Student();
s.setName("张三");
//动态生成代理对象,(模拟SqlSession中的GetMapper方法的实现)
MyInvocationHandler<Student> invo=new MyInvocationHandler<>();
invo.setObj(s);
Submitted sub=invo.createProxySubject();
fun(sub);
}
//参数是接口,只要实现了接口,具体对象是谁无所谓
public static void fun(Submitted sub) {
sub.submitHomework();
}
}