Red de conocimiento informático - Problemas con los teléfonos móviles - El proxy dinámico de Spring tiene varias implementaciones

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;

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

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