Mode proxy menggunakan objek proxy untuk menyelesaikan permintaan pengguna dan memblokir akses pengguna ke objek nyata.
Mode proxy memiliki banyak kegunaan, seperti untuk alasan keamanan, perlu untuk memblokir klien dari secara langsung mengakses objek nyata; atau dalam panggilan jarak jauh, objek proxy perlu digunakan untuk menangani detail teknis dalam metode jarak jauh; atau untuk meningkatkan sistem, objek nyata dienkapsulasi untuk mencapai tujuan pemuatan yang tertunda.
Ketika sistem dimulai, memisahkan metode yang menghabiskan sebagian besar sumber daya menggunakan mode proxy dapat mempercepat kecepatan startup sistem dan mengurangi waktu tunggu pengguna. Ketika pengguna benar -benar melakukan kueri, kelas proxy kemudian memuat kelas nyata untuk menyelesaikan permintaan pengguna. Ini adalah tujuan menggunakan mode proxy untuk mencapai pemuatan malas.
1. Implementasi proxy statis:
Antarmuka Topik:
antarmuka publik IDBQuery {String request (); } Topik Nyata:
DbQuery kelas publik mengimplementasikan IDBQuery {public dBQuery () {try {thread.sleep (10000); } catch (Exception e) {E.PrintStackTrace (); }} permintaan string publik () {return "string request"; }} Kelas proxy:
IDBQueryProxy kelas publik mengimplementasikan IDBQuery {private dbQuery dbQuery; Public String Request () {if (dbQuery == null) dbQuery = dbQuery baru (); return dbQuery.request (); }} Akhirnya, fungsi utama:
Public Class ProxyText {public static void main (string [] args) {idBQuery dbQuery = new iDbQueryProxy (); System.out.println (DBQuery.Request ()); }}Proksi statis mencatat bahwa kelas proxy adalah antarmuka umum untuk diimplementasikan kelas nyata, dan kelas proxy mengacu pada objek kelas nyata, dan menempatkan operasi yang memakan waktu dalam metode kelas proxy untuk mengimplementasikannya.
Proxy Dinamis:
Proksi dinamis adalah saat berjalan, secara dinamis menghasilkan kelas proxy. Artinya, bytecode kelas proxy dihasilkan dan dimuat saat runtime. Dibandingkan dengan agen statis, agen dinamis tidak perlu berhati -hati untuk merangkum kelas enkapsulasi yang sepenuhnya identik untuk tujuan nyata. Jika ada banyak antarmuka topik, mengganggu untuk menulis metode proxy untuk setiap antarmuka. Jika antarmuka berubah, kelas nyata dan kelas proxy perlu diubah, yang tidak kondusif untuk pemeliharaan sistem; Kedua, metode pembuatan beberapa agen dinamis bahkan dapat dijalankan pada saat runtime, yang merupakan logika eksekusi kelas proxy yang ditentukan, sehingga sangat meningkatkan fleksibilitas sistem.
Antarmuka Topik:
antarmuka publik IDBQuery {String request (); } Kelas Proxy JDK:
kelas publik JDBDBQueryHandler mengimplementasikan InvocationHandler {IDBQuery IDBQuery = null; @Override Public Object Invoke (objek proxy, metode metode, objek [] args) melempar lempar {if (idBQuery == null) {idBQuery = new dbQuery (); } return IDBQuery.Request (); } public static IDBQuery createJdBproxy () {IDBQuery jDKproxy = (idBQuery) proxy.newproxyInstance (classloader.getSystemClassLoader (), kelas baru [] {idbQuery.class}, new jdbdbQueryLler () (); System.out.println ("JDBDBQueryHandler.CreateJDBProxy ()"); return JDKProxy; }} Fungsi utama:
Public Class ProxyText {public static void main (string [] args) {idBQuery idBQuery = jdbdbQueryHandler.createJdbproxy (); System.out.println (IDBQuery.Request ()); }}Selain itu, Anda juga dapat menggunakan CGLIB dan proxy dinamis Javassist untuk menjadi mirip dengan proxy dinamis JDK, tetapi proses pembuatan kelas dinamis JDK adalah yang tercepat, karena metode difineclass () bawaan didefinisikan sebagai implementasi asli, sehingga kinerjanya lebih baik daripada yang lain. Dalam fungsi panggilan kelas proxy, proxy dinamis JDK tidak sebagus proxy dinamis CGLIB dan Javassist, sementara proxy dinamis Javassist memiliki kualitas kinerja terburuk, dan bahkan lebih buruk daripada implementasi JDK. Dalam aplikasi pengembangan aktual, frekuensi panggilan metode kelas proxy jauh lebih tinggi daripada frekuensi generasi aktual dari kelas proxy, sehingga metode yang memanggil kinerja proxy dinamis harus menjadi fokus kinerja. JDK Dynamic Proxy mengamanatkan bahwa kelas proxy dan topik nyata menerapkan antarmuka terpadu, dan proxy dinamis CGLIB dan Javassist tidak memiliki persyaratan tersebut.
Di Java, implementasi proxy dinamis melibatkan penggunaan classloader. Mengambil CGLIB sebagai contoh, deskripsi singkat tentang proses pemuatan kelas dinamis dijelaskan. Menggunakan CGLIB untuk menghasilkan proxy dinamis, pertama -tama Anda harus menghasilkan instance dari kelas penambah dan merumuskan kelas panggilan balik untuk menangani bisnis proxy. Dalam metode Enhancer.Create (), bytecode kelas proxy akan dihasilkan menggunakan metode defaultGeneratorStrategy.generate () dan disimpan dalam array byte. Kemudian hubungi metode reflectutils.defineClass (), dan melalui refleksi, panggilan classloader.defineClass () metode untuk memuat bytecode ke classloader untuk menyelesaikan pemuatan kelas. Akhirnya, melalui metode reflectutils.newinstance (), instance kelas dinamis dihasilkan oleh refleksi dan instance dikembalikan. Yang lain berbeda dari detail proses, tetapi logika generasi adalah sama.
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.