En algunos proyectos Java, MapperScannerConfigurer se utiliza en la integración de mybatis y spring. Esta clase genera automáticamente clases de proxy dinámico basadas en interfaz a través de proxy inverso.
En vista de esto, este artículo analiza brevemente el proxy dinámico de Java.
Este artículo utiliza un proxy dinámico para simular un interceptor que maneja transacciones.
interfaz:
interfaz pública UserService { public void addUser(); public void removeUser(); public void searchUser();}Clase de implementación:
clase pública UserServiceImpl implementa UserService { public void addUser() { System.out.println("agregar usuario"); public void removeUser() { System.out.println("eliminar usuario" } public void searchUser() { System.out.println("buscar usuario"); }}Hay dos formas de implementar el proxy dinámico de Java.
1. El proxy dinámico que viene con jdk
Para utilizar el proxy dinámico que viene con jdk, debe comprender la interfaz InvocationHandler y la clase Proxy. Ambas se encuentran en el paquete java.lang.reflect.
Introducción al controlador de invocación:
InvocationHandler es la interfaz implementada por el controlador de invocación de la instancia de proxy.
Cada instancia de proxy tiene un InvocationHandler asociado. Al llamar a un método en una instancia de proxy, este método llama al método de invocación de InvocationHandler.
Introducción al proxy:
Proxy proporciona métodos estáticos para crear clases e instancias de proxy dinámicas.
Ejemplo (simulando el procesamiento de transacciones AOP):
public class TransactionInterceptor implementa InvocationHandler { objetivo de objeto privado; setTarget público vacío (objeto de destino) { this.target = objetivo } @Override invocación de objeto público (proxy de objeto, método de método, argumentos de objeto) throwable { System.out.println ("iniciar transacción"); método.invoke(destino, argumentos); System.out.println("finalizar transacción");Código de prueba:
clase pública TestDynamicProxy { @Test public void testJDK() { TransactionInterceptor transacciónInterceptor = nuevo TransactionInterceptor(); UserService userService = nuevo UserServiceImpl(); userService.getClass(); .getClassLoader(), userService.getClass().getInterfaces(), transacciónInterceptor); userServiceProxy.addUser();Resultados de la prueba:
iniciar transacciónagregar usuariofinalizar transacción
Obviamente, cuando realizamos una llamada a un método a través de la clase proxy userServiceProxy, la transacción se abrirá y cerrará antes y después de la llamada al método.
2. Biblioteca de terceros cglib
CGLIB es una biblioteca de generación de código potente, de alto rendimiento y de alta calidad para ampliar las clases de Java e implementar interfaces Java en tiempo de ejecución.
La mayor diferencia entre este y el proxy dinámico de JDK es:
El proxy dinámico JDK es para interfaces, mientras que cglib implementa proxy para clases. El principio de cglib es generar una subclase para la clase de destino especificada y sobrescribir los métodos para lograr mejoras. Sin embargo, debido a que se usa la herencia, final no puede ser La clase modificada es. apoderado.
El código de ejemplo es el siguiente:
clase pública UserServiceCallBack implementa MethodInterceptor { @Override public Objeto interceptar(Objeto o, Método método, Objeto[] args, MethodProxy métodoProxy) throwable { System.out.println("iniciar transacción por cglib"); ); System.out.println("finalizar transacción por cglib");Código de prueba:
clase pública TestDynamicProxy { @Test public void testCGLIB() { Potenciador potenciador = nuevo Potenciador(); potenciador.setSuperclass(UserServiceImpl.class)mejorador.setCallback(nuevo proxy UserServiceCallBack()); ; proxy.addUser(); }}Resultados de la prueba:
iniciar transacción por cglibadd usuario finalizar transacción por cglib
Los lectores interesados pueden probar los ejemplos de este artículo y creo que ganarán mucho.