English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hablemos juntos sobre el patrón de proxy Java
1、proxy estático
1.1El proxy de la proxy estática y la clase proxyada deben mantener una interfaz común.
public interface IUserDao { void save(); }
1.2La clase que se proxya, el objeto de destino
public class UserDao implements IUserDao{ @Override public void save() { System.out.println("-----¡Los datos se han guardado con éxito!!!------"); } }
1.3Objeto agente
public class UserDaoProxy implements IUserDao{ // Recibir el objeto de destino para guardar private IUserDao target; public UserDaoProxy(IUserDao target) { this.target = target; } @Override public void save() { System.out.println("Inicio de transacción..."); target.save(); // Ejecutar el método del objeto objetivo System.out.println("Presentar transacción..."); } }
1.4Clase de prueba
public class App { public static void main(String[] args) { // Objeto objetivo IUserDao target = new UserDao(); // Proxy IUserDao proxy = new UserDaoProxy(target); proxy.save(); // Ejecuta es, el método del proxy } }
2、proxy dinámico
2.1Del mismo modo, el proxy dinámico también necesita completar una interfaz. (Igual que antes)
2.2El objeto de destino también es el mismo.
2.3Sólo hay diferencias en el objeto proxy
public class ProxyFactory { // Mantener un objeto de destino private Object target; public ProxyFactory(Object target){ this.target = target; } // Crear objeto proxy para el objeto de destino public Object getProxyInstance() { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Abrir transacción"); // ejecutar método del objeto de destino Object returnValue = method.invoke(target, args); System.out.println("Enviar transacción"); return returnValue; } }); } }
2.4Clase de prueba
public class App { public static void main(String[] args) { // Objeto objetivo IUserDao target = new UserDao(); System.out.println(target.getClass()); // Crear objeto proxy para el objeto de destino IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); // ejecutar método 【objeto proxy】 proxy.save(); } }
3y proxy cglib
3.1El proxy cglib no necesita completar la interfaz, solo se necesita escribir la clase del objeto que se proxya y la clase del proxy, aquí la clase del objeto que se proxya es la misma1.2,por lo tanto, no se escribe.
3.2La clase de proxy es diferente, para usar el patrón de proxy cglib se necesita referenciar el paquete del framework central de spring.
public class ProxyFactory implements MethodInterceptor{ // mantener objeto de destino private Object target; public ProxyFactory(Object target){ this.target = target; } // Crear objeto proxy para el objeto de destino public Object getProxyInstance(){ //1. clase de herramienta Enhancer en = new Enhancer(); //2. establecer clase padre en.setSuperclass(target.getClass()); //3. establecer función de retroalimentación en.setCallback(this); //4. crear subclase (objeto proxy) return en.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {}} System.out.println("Inicio de transacción....."); // Ejecutar el método del objeto objetivo Object returnValue = method.invoke(target, args); System.out.println("Enviar transacción....."); return returnValue; } }
3.3Clase de prueba
public class App { public static void main(String[] args) { // Objeto objetivo UserDao target = new UserDao(); System.out.println(target.getClass()); // Objeto agente UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); // Ejecutar el método del objeto agente proxy.save(); } }
Este es el contenido completo del artículo. Espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de clamor.
Declaración: el contenido de este artículo se ha obtenido de la red, pertenece al propietario original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relevante. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.