MyBatis-02-01-Mecanismo y demostración de proxy dinámico y proxy estático de MyBatis


Mecanismo de proxy dinámico

Inserte la descripción de la imagen aquí

API proporcionada por MyBatis tradicional

Inserte la descripción de la imagen aquí

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>

Inserte la descripción de la imagen aquí

Existe una correspondencia uno a uno entre las interfaces izquierda y derecha y el id.

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Proxy estático y proxy dinámico

Distinguir la clave: si estas tres entidades existen en la etapa de operación del programa
Inserte la descripción de la imagen aquí

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();
	}

}

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
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

Inserte la descripción de la imagen aquí

Proxy dinámico

Estructura del proyecto

Inserte la descripción de la imagen aquí

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();
	}

}

Supongo que te gusta

Origin blog.csdn.net/qq_44627608/article/details/115351636
Recomendado
Clasificación