Implementasi proxy dinamis
Mode Digunakan: Mode Proxy.
Fungsi mode proxy adalah untuk menyediakan proxy untuk objek lain untuk mengontrol akses ke objek ini. Mirip dengan agen penyewaan.
Dua proxy dinamis:
(1) Proxy dinamis JDK. Proxy dinamis JDK diimplementasikan oleh mekanisme refleksi di dalam Java. Kelas target didasarkan pada antarmuka terpadu (InvocationHandler)
(2) Proxy dinamis CGLIB, dan lapisan yang mendasari proxy dinamis CGLIB diimplementasikan dengan bantuan ASM. Proksi dinamis yang diimplementasikan oleh perpustakaan pihak ketiga seperti CGLIB lebih banyak digunakan dan memiliki lebih banyak keuntungan dalam efisiensi.
Kerangka kerja aplikasi utama:
AOP di Musim Semi, Interceptor di Struts2
Implementasi spesifik:
1. Tentukan antarmuka dan mengimplementasikan kelas
paket com.example.service; antarmuka publik Userservice {public string getName (int id); Public Integer Getage (int id);} Paket com.example.service.impl; import com.example.service.userservice; kelas publik UserserviceImpl mengimplementasikan UserService {public string getName (int id) {System.out.println ("------ getName -----"); mengembalikan "kucing"; } getage integer publik (int id) {system.out.println ("------ getage -----"); kembali 10; }}2. Implementasi Proxy Dinamis JDK
Paket com.example.jdk; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; impor java.lang.reflect.proxy; kelas publik MyInvocationHandler mengimplementasikan doa didakwa {target objek pribadi; / ** * mengikat objek delegasi dan mengembalikan kelas proxy * * @param target * @return */ objek publik mengikat (target objek) {this.target = target; // Dapatkan Proxy Object Return Proxy.NewProxyInstance (target.getClass (). GetClassLoader (), target.getClass (). GetInterfaces (), this); // Untuk mengikat antarmuka (ini adalah cacat, cGlib menebus cacat ini)} @Override Objek publik Invoke (objek proxy, metode metode, objek [] args) melempar lempar {if ("getName" .sequals (method.getName ())) {System.out.println ("------" + Metode. Hasil objek = metode.invoke (target, args); System.out.println ("------ Setelah" + Method.getName () + "------"); hasil pengembalian; } else {Object hasil = Method.invoke (target, args); hasil pengembalian; }}} Paket com.example.jdk; import com.example.service.userservice; import com.example.service.impl.userserviceImpl;/*** kelas uji*/kelas publik runjdk {public static void Main (string [] args) {myinvocationHandler proxy = myinvocationHandler baru (); UserService UserServiceProxy = (Userservice) Proxy.Bind (UserserServiceImpl baru ()); System.out.println (UsersServiceProxy.getName (1)); System.out.println (UsersServiceProxy.getage (1)); }}Hasil Menjalankan:
------ sebelum getName ----
------ getName -----
------ Setelah GetName -----
kucing
----- getage -----
10
3. Implementasi proxy dinamis CGLIB:
Mekanisme proxy dinamis JDK hanya dapat membuat proksi kelas yang mengimplementasikan antarmuka, tetapi kelas yang tidak dapat mengimplementasikan antarmuka tidak dapat mengimplementasikan proxy dinamis JDK. CGLIB mengimplementasikan proxy untuk kelas. Prinsipnya adalah menghasilkan subkelas untuk kelas target yang ditentukan dan menimpa peningkatan implementasi metode. Namun, karena warisan digunakan, kelas yang dimodifikasi oleh final tidak dapat diproksi.
Kelas inti CGLIB:
net.sf.cglib.proxy.enhancer kelas peningkatan utama
net.sf.cglib.proxy.methodInterceptor Metode utama mencegat kelas, yang merupakan subinterface dari antarmuka callback dan membutuhkan implementasi pengguna.
net.sf.cglib.proxy.methodproxy kelas proxy dari Java.lang.reflect.method kelas JDK dapat dengan mudah menerapkan panggilan ke sumber metode objek.
Antarmuka net.sf.cglib.proxy.methodinterceptor adalah tipe callback yang paling umum, dan sering digunakan oleh AOP berbasis proxy untuk menerapkan panggilan metode intersep. Antarmuka ini hanya mendefinisikan satu metode
Intercept Objek Publik (Objek Objek, Java.lang.Reflect.Method Metode,
Objek [] args, proxy methodproxy) melempar yang dapat dilempar;
Parameter pertama adalah objek proxy, dan parameter kedua dan ketiga adalah metode yang dicegat dan parameter metode, masing -masing. Metode asli mungkin dipanggil dengan menggunakan panggilan refleksi umum menggunakan objek java.lang.reflect.method, atau dengan menggunakan objek net.sf.cglib.proxy.methodproxy. net.sf.cglib.proxy.methodproxy biasanya lebih disukai karena lebih cepat.
Paket com.example.cglib; impor org.springframework.cglib.proxy.enhancer; impor org.springframework.cglib.proxy.methodinterceptor; impor org.spramework.cglib.proxy.methodproxy; impor java.Lang {target objek pribadi; / ** * Buat objek proxy * * @param target * @return */ objek publik getInstance (objek target) {this.target = target; Penambah penambah = penambah baru (); Enhancer.setsuperclass (this.target.getClass ()); // Callback Method Enhancer.setCallback (ini); // Buat penambah pengembalian objek proxy.create (); } @Override Public Object Intercept (Object O, Metode Metode, Objek [] Objek, MethodProxy MethodProxy) melempar Throwable {System.out.println ("++++++++++"); System.out.println (method.getName ()); Hasil Objek = MethodProxy.invokeSuper (O, Objek); System.out.println ("+++++++ setelah"+MethodProxy.GetSuperName ()+"+++++++++"); hasil pengembalian; }} package com.example.cglib;import com.example.service.UserService;import com.example.service.impl.UserServiceImpl;/** * Test CGLIB */public class RunCGLIB { public static void main(String[] args) { CGLIBProxy cglibProxy = new CGLIBProxy(); UserService UserService = (UserserService) cglibproxy.getInstance (UserserServiceImpl baru ()); UsserService.getName (1); Userservice.getage (1); }}Hasil Menjalankan:
++++++ Sebelum cGlib $ getName $ 0 ++++++++
GetName
------ getName -----
++++++ Setelah CGLIB $ getName $ 0 ++++++++
++++++ sebelum cGlib $ getage $ 1 ++++++++
getage
----- getage -----
++++++ Setelah CGLIB $ getage $ 1 +++++++++
Di atas adalah semua konten artikel ini. Saya berharap konten artikel ini akan membantu untuk belajar atau bekerja semua orang. Saya juga berharap untuk mendukung wulin.com lebih lanjut!