Implementierung des dynamischen Proxy
Modus verwendet: Proxy -Modus.
Die Funktion des Proxy -Modus besteht darin, einen Proxy für andere Objekte zur Steuerung des Zugriffs auf dieses Objekt bereitzustellen. Ähnlich wie eine Mietbehörde.
Zwei dynamische Proxy:
(1) JDK Dynamic Proxy. JDK Dynamic Proxy wird durch den Reflexionsmechanismus in Java implementiert. Die Zielklasse basiert auf einer einheitlichen Schnittstelle (InvocationHandler)
(2) CGGLIB Dynamic Proxy und die zugrunde liegende Schicht des CGGLIB Dynamic Proxy werden mit Hilfe von ASM implementiert. Der dynamische Proxy, der in der Bibliothek von Drittanbietern wie CGGLIB implementiert wird, wird weiterhin genutzt und hat mehr Vorteile in der Effizienz.
Hauptanwendungs -Framework:
AOP im Frühjahr, Interceptor in Struts2
Spezifische Implementierung:
1. Definieren Sie Schnittstellen und implementieren Sie Klassen
paket com.example.service; public interface userservice {public String getName (int id); Öffentliche Ganzzahl getage (int id);} paket com.example.service.impl; import com.example.service.userService; public class UserServiceImpl implementiert UserService {public String getName (int id) {System.out.println ("------ GetName -----"); Rückkehr "Katze"; } public Integer getage (int id) {System.out.println ("------ Getage ------"); Rückkehr 10; }}2. JDK Dynamic Proxy Implementierung
paket com.example.jdk; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; öffentliche Klasse myInvocationHandler implements InvocationHandler {privates Objekt; / ** * Binden Sie das Delegate -Objekt und geben Sie eine Proxy -Klasse zurück * * @param target * @return */ public Object Bind (Objektziel) {this.target = target; // Erhalten Sie das Proxy -Objekt -Rückgabe proxy.newproxyInstance (target.getClass (). GetClassloader (), target.getClass (). GetInterfaces (), dies); // Um die Schnittstelle zu binden (dies ist ein Defekt, macht CGlib diesen Defekt aus)} @Override öffentliches Objekt invoke (Object Proxy, Methode Methode, Object [] args) löscht Throwable {if ("getName" .equals (methode.getName ()) {System.out.println ("------------- Objektergebnis = methode.invoke (Ziel, Args); System.out.println ("------ After" + method.getName () + "------"); Rückgabeergebnis; } else {Object result = methode.invoke (Ziel, args); Rückgabeergebnis; }}} paket com.example.jdk; import com.example.service.userService; import com.example.service.impl.userserviceImpl;/*** Testklasse*/public class Runjdk {public static void main (String [] args) {myInvocationHandler proxy = new myInvocationhandler (); UserService UserServiceProxy = (UserService) Proxy.bind (New UserServiceImpl ()); System.out.println (UserServiceProxy.getName (1)); System.out.println (UserServiceProxy.getage (1)); }}Auslaufergebnisse:
------ Vor GetName ----
------ GetName -----
------ Nach GetName -----
Katze
----- Getage -----
10
3.. CGGLIB Dynamic Proxy -Implementierung:
Der dynamische Proxy -Mechanismus von JDK kann nur die Klassen, die Schnittstellen implementieren, in Anspruch nehmen, aber Klassen, die keine Schnittstellen implementieren können, können den dynamischen Proxy von JDK nicht implementieren. Cglib implementiert Proxy für Klassen. Sein Prinzip ist es, eine Unterklasse für die angegebene Zielklasse zu generieren und die Verbesserung der Methodeimplementierung zu überschreiben. Da die Vererbung jedoch verwendet wird, kann die von der endgültige Klasse modifizierte Klasse jedoch nicht vervollständigt werden.
Kernklassen von CGlib:
net.sf.cglib.proxy.enhancer Hauptverstärkungsklasse
net.sf.cglib.proxy.Methodinterceptor Die Hauptmethode fängt die Klasse ab, die eine Teilinteresse der Callback -Schnittstelle ist und die Benutzerimplementierung erfordert.
net.sf.cglib.proxy.methodproxy Die Proxy -Klasse der Java.lang.reflect.Method -Klasse von JDK kann Aufrufe auf Quellobjektmethoden problemlos implementieren.
Die Net.sf.cglib.proxy.Methodinterceptor-Schnittstelle ist der allgemeinste Rückruftyp und wird häufig von Proxy-basierten AOP verwendet, um Intercept-Methodenaufrufe zu implementieren. Diese Schnittstelle definiert nur eine Methode
öffentliches Objekt Intercept (Objektobjekt, Java.lang.reflect.Method -Methode,
Objekt [] args, MethodProxy -Proxy) wirft Throwable;
Der erste Parameter ist das Proxy -Objekt, und die zweite und dritte Parameter sind die abgefangene Methode bzw. die Parameter der Methode. Die ursprüngliche Methode kann unter Verwendung eines allgemeinen Reflexionsaufrufs mit einem java.lang.reflect.method -Objekt oder unter Verwendung eines net.sf.cglib.proxy.methodproxy -Objekts aufgerufen werden. net.sf.cglib.proxy.methodproxy wird normalerweise bevorzugt, da es schneller ist.
paket com.example.cglib; import org.springframework.cglib.proxy.enhancer; import org.springframework.cglib.proxy.methodinterceptor; importieren org. privates Objektziel; / ** * Proxy -Objekt erstellen * * @param target * @return */ public Object getInstance (Objektziel) {this.target = target; Enhancer Enhancer = neuer Enhancer (); Enhancer.SetsuperClass (this.target.getClass ()); // Callback -Methode Enhancer.SetCallback (this); // Proxy -Objekt -Rückgabe -Enhancer erstellen.create (); } @Override public Object Intercept (Object O, Method -Methode, Objekt [] Objekte, MethodProxy -MethodeProxy) löscht Throwable {System.out.println ("+++++++ vor"+methodProxy.getSuperName ()+"+++++"). System.out.println (method.getName ()); Objektergebnis = methodProxy.invokesuper (O, Objekte); System.out.println ("++++++ nach"+methodProxy.getSuperName ()+"+++++++ -"); Rückgabeergebnis; }} paket com.example.cglib; import com.example.service.userservice; import com.example.service.impl.userserviceImpl;/** * testen cglib */public class runcglib {public static void main (String [] args) {cglibProxy cglibProxy = new CglibProxy (); UserService UserService = (UserService) cglibProxy.getInstance (neuer userServiceImpl ()); UserService.getName (1); UserService.getage (1); }}Auslaufergebnisse:
+++++++ Bevor CGlib $ GetName $ 0 +++++++++
GetName
------ GetName -----
+++++++ Nach CGlib $ GetName $ 0 +++++++++
++++++ vor CGlib $ Getage $ 1 ++++++++
Getage
----- Getage -----
++++++ nach CGLIB $ Getage $ 1 ++++++++
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für das Studium oder die Arbeit eines jeden hilfreich sein wird. Ich hoffe auch, Wulin.com mehr zu unterstützen!