In diesem Artikel werden hauptsächlich die relevanten Kenntnisse über Spring CGlib und JDK Dynamic Proxy vorgestellt, die einen guten Referenzwert haben. Werfen wir einen Blick mit dem Editor unten
1. Übersicht
Der dynamische JDK-Proxy verwendet den Java-Reflektionsmechanismus, um eine anonyme Klasse zu generieren, die die Schnittstelle implementiert und spezifisch aufruft Methoden Vor dem Aufruf von InvocationHandler zur Verarbeitung
Der dynamische Proxy von Cglib verwendet das Open-Source-Paket ASM, um die Klassendatei der Proxy-Klasse zu laden und ihren Bytecode zu ändern, um eine zu verarbeitende Unterklasse zu generieren
Wenn das Zielobjekt implementiert ist. Die Schnittstelle verwendet dann standardmäßig den JDK-Proxy (die Verwendung des cglib-Proxys kann erzwungen werden).
Wenn die Schnittstelle nicht implementiert ist, muss der cglib-Proxy verwendet werden.
Die Verwendung von erzwingen cglib-Proxy erfordert
*Führen Sie das cglibjar-Paket ein
*Konfigurieren Sie Spring
cglib ist eine Methode, die dynamisch Unterklassen der Proxy-Klasse generiert und die Methode der Proxy-Klasse überschreibt. Um dies zu erreichen, sollte die Proxy-Methode nicht mit final
2 geändert werden
2.1 cglib-Proxy-Klasse
package com.rocky.spring; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxy { public static void main(String[] args) { final UserService service = new UserService(); Enhancer hancer = new Enhancer(); hancer.setSuperclass(service.getClass()); hancer.setCallback(new MethodInterceptor(){ @Override public Object intercept(Object proxy, Method method, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("增强前 ... Cglib"); Object invoke = method.invoke(service, arg2); System.out.println("增强后 ... Cglib"); return invoke; }}); UserService userService = (UserService) hancer.create(); userService.sayHello(); } } //需要引入cglib-2.2.jar 和org.objectweb.asm-3.3.1.jar //输出 //增强前 ... Cglib //this userService works.... //增强后 ... Cglib
Proxy-Klasse UserService
package com.rocky.spring; public class UserService { public void sayHello(){ System.out.println("this userService works...."); } }
2.2 JDK-Proxy-Schnittstelle
package com.rocky.spring; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkProxy { public static void main(String[] args) { final ActorService service = new ActorServiceImpl(); ActorService actorService = (ActorService) Proxy.newProxyInstance( service.getClass().getClassLoader(), service.getClass() .getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("增强前...jdk"); Object invoke = method.invoke(service, args); System.out.println("增强后...jdk"); return invoke; } }); actorService.sayHi(); } } //增强前...jdk //Honestly, I do the work. //增强后...jdk
Proxy-Schnittstellen und Implementierungsklassen
package com.rocky.spring; public interface ActorService { public void sayHi(); } ----------------- package com.rocky.spring; public class ActorServiceImpl implements ActorService { @Override public void sayHi() { doSomething(); } private void doSomething() { System.out.println("Honestly, I do the work."); } }
[Verwandte Empfehlungen]
1 Kostenlose Java-Video-Tutorials
2. 3.Umfassende Analyse von Java-AnnotationenDas obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der dynamischen Proxys von cglib und jdk. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!