Dalam beberapa proyek Java, MapperScannerConfigurer digunakan dalam integrasi mybatis dan spring. Kelas ini secara otomatis menghasilkan kelas proxy dinamis berbasis antarmuka melalui proxy terbalik.
Mengingat hal ini, artikel ini menganalisis secara singkat proxy dinamis Java.
Artikel ini menggunakan proksi dinamis untuk mensimulasikan pencegat yang menangani transaksi.
antarmuka:
antarmuka publik Layanan Pengguna { public void addUser(); public void deleteUser();Kelas implementasi:
kelas publik UserServiceImpl mengimplementasikan UserService { public void addUser() { System.out.println("tambahkan pengguna" } public void deleteUser() { System.out.println("hapus pengguna" } public void searchUser() { System.out.println("pencarian pengguna"); }}Ada dua cara untuk mengimplementasikan proxy dinamis java
1. Proksi dinamis yang disertakan dengan jdk
Untuk menggunakan proksi dinamis yang disertakan dengan jdk, Anda perlu memahami antarmuka InvocationHandler dan kelas Proxy. Keduanya berada di bawah paket java.lang.reflect.
Pengenalan InvocationHandler:
InvocationHandler adalah antarmuka yang diimplementasikan oleh pengendali pemanggilan instance proksi.
Setiap instans proksi memiliki InvocationHandler terkait. Saat memanggil metode pada instans proksi, metode ini memanggil metode pemanggilan dari InvocationHandler.
Pengenalan proksi:
Proxy menyediakan metode statis untuk membuat kelas dan instance proxy dinamis.
Contoh (simulasi pemrosesan transaksi AOP):
public class TransactionInterceptor mengimplementasikan InvocationHandler { private Object target; public void setTarget(Object target) { this.target = target } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println ("mulai Transaksi"); metode.invoke(target, args); System.out.println("akhir Transaksi");Kode tes:
public class TestDynamicProxy { @Test public void testJDK() { TransactionInterceptor transaksiInterceptor = new TransactionInterceptor(); UserService userService = new UserServiceImpl(); .getClassLoader(), userService.getClass().getInterfaces(), transaksiInterceptor); userServiceProxy.addUser();Hasil tes:
mulai Transaksitambahkan Transaksi akhir pengguna
Jelasnya, ketika kita melakukan pemanggilan metode melalui kelas proxy userServiceProxy, transaksi akan dibuka dan ditutup sebelum dan sesudah pemanggilan metode.
2. Cglib perpustakaan pihak ketiga
CGLIB adalah pustaka pembuatan kode yang kuat, berkinerja tinggi, dan berkualitas tinggi untuk memperluas kelas Java dan mengimplementasikan antarmuka Java saat runtime.
Perbedaan terbesar antara ini dan proksi dinamis JDK adalah:
Proksi dinamis JDK ditujukan untuk antarmuka, sedangkan cglib mengimplementasikan proksi untuk kelas. Prinsip cglib adalah menghasilkan subkelas untuk kelas target yang ditentukan dan menimpa metode untuk mencapai peningkatan. Namun, karena warisan digunakan, final tidak dapat menjadi kelas yang dimodifikasi diproksi.
Contoh kodenya seperti berikut:
public class UserServiceCallBack mengimplementasikan MethodInterceptor { @Override public Object intersep(Objek o, Metode metode, Objek[] args, MethodProxy methodProxy) throws Throwable { System.out.println("mulai Transaksi dengan cglib"); ); System.out.println("akhiri Transaksi dengan cglib");Kode tes:
kelas publik TestDynamicProxy { @Test public void testCGLIB() { Peningkat penambah = Peningkat baru(); peningkat.setSuperclass(UserServiceImpl.kelas peningkat.setCallback(Proksi UserServiceImpl baru()); ; proxy.tambahkanPengguna(); }}Hasil tes:
mulai Transaksi oleh cglibadd userend Transaksi oleh cglib
Pembaca yang tertarik sebenarnya dapat menguji contoh di artikel ini, dan saya yakin mereka akan mendapatkan banyak manfaat.