El proxy dinámico de Spring tiene varias implementaciones
Implementación del proxy JAVA
La implementación del proxy se divide en proxy dinámico y proxy estático. La implementación del proxy estático encapsula la clase JAVA generada.
Los agentes dinámicos se generan en tiempo de ejecución. Generalmente existen dos métodos para generar agentes dinámicos en JAVA.
Implementación de JDK
JDK implementa la generación de proxy utilizando la clase java.lang.reflect.Proxy. El método de implementación es el siguiente
EX:public?class. ?JDKProxy? { public?static?Object?getPoxyObject(final?Object?c)?{
return?Proxy.newProxyInstance(c.getClass().getClassLoader(),?c.getClass(). getInterfaces() ,//?JDK implementa un proxy dinámico, pero la implementación de JDK debe requerir una interfaz
new?InvocationHandler()?{ public?Object?invoke(Object?proxy,?Method?method,?Object[ ]?args )?throws?Throwable?{
//?TODO?auto-generated?method?stub
Objeto?reObj?=?null; p>
System.out.print("¿tú?dices:?")
reObj?=?method.invoke(c,?args);
System. out.println ("?")
Objeto?["?+?Calendar.getInstance().get(Calendar.HOUR)?+ :"
+? Calendar.getInstance ().get(Calendar.MINUTO)?+?"?"
+?Calendar.getInstance().get(Calendar.SECOND)?+?"]") )
return?reObj; }
}); }
}
Método de clase de proxy de prueba public?class?TestForPoxy?{ public?static? void?main (String[]?args )?{
ServiceTest?service?=?new?ServiceTestImpl();
System.out.println(service.getClass(). getSimpleName() );
ServiceTest?poxyService?=?(ServiceTest)?JDKProxy.getPoxyObject(servicio);
System.out.println(poxyService.getClass().getSuperclass( ));
poxyService .saySomething("hola,Mi?QQ?code?is?107966750 ..");
poxyService.saySomething("¿cómo te llamas?");
poxyService.saySomething("¿solo? para? prueba, jejeje."); }
}
1. tener una implementación de interfaz
2. La clase de proxy generada es una clase de implementación de interfaz, y la clase de destino no se puede convertir en una clase de destino, solo se puede convertir en una clase de implementación de interfaz para llamar
Características obvias: generado por este método El nombre de la clase es $Proxy0
Implementación del paquete CGLIB
CGLIB es un proyecto de código abierto, su sitio web oficial es: /, puede ir arriba
Descargue el último paquete JAR.
Este proyecto utiliza cglib-3.0.jar
Este proyecto también agrega paquetes JAR dependientes asm-4.0.jar y asm-util-4.0.jar p>
La implementación es la siguiente
EX:public?class?CGLIBProxy?{ public?static?Object? getPoxyObject(Object?c)?{
Enhancer?enhancer ? =?new?Enhancer();
enhancer.setSuperclass(c.getClass());
enhancer.setCallback(new? MethodInterceptor()?{ public?Object?intercept ( ¿Objeto?arg0,?Método?arg1,?Objeto[]?arg2,?MethodProxy?proxy)?throws?["?+?Calendar.getInstance().get(Calendar.HOUR)?+?" p >
+?Calendar.getInstance().get(Calendar.MINUTO)?+?"?"?+?Calendar.getInstance().get(Calendar.SECOND)
+?" ] ") )
return?null; }
});
return?enhancer.create(); }
}
Métodos de clase de agente de pruebapúblico?{
ServiceTest?service?=?new?ServiceTestImpl();
System.out.println(service.getClass() . getSimpleName());
/?ServiceTest?poxyService?=?(ServiceTest)?JDKProxy.getPoxyObject(servicio);
ServiceTest?poxyService?=?(ServiceTest)?CGLIBProxy. . getPoxyObject(servicio);
System.out.println(poxyService.getClass().getSuperclass());
poxyService.saySomething("hola,My.QQ.code. es .107966750..");
poxyService.saySomething("¿cómo te llamas?");
poxyService.saySomething("¿solo? para? prueba, jejeje."); }
}
}
1. CGLIB se implementa heredando el proxy de la clase de destino
2. can No hay métodos y la clase generada se puede convertir directamente en una implementación de la clase de destino o la interfaz de la clase de destino. O la clase de implementación de la interfaz de la clase de destino, debido a la conversión ascendente de JAVA
Característica obvia: a través de la vista de salida, puede ver que la clase principal de la clase de proxy generada es el proxy de la clase objetivo