Mengapa kita perlu mempelajari mod ejen? Ini ialah lapisan bawah SpringAOP [SpringAOP dan SpringMVC]
Klasifikasi mod proksi:
Proksi statik
Proksi dinamik
Dalam proksi statik, peningkatan kami bagi setiap kaedah objek sasaran dilakukan secara manual ( The kod akan ditunjukkan secara terperinci kemudian_), sangat tidak fleksibel (contohnya, sebaik sahaja kaedah baharu ditambahkan pada antara muka, objek sasaran dan objek proksi mesti diubah suai) dan menyusahkan (_perlu menulis kelas proksi berasingan untuk setiap kelas sasaran ). Terdapat sangat sedikit senario aplikasi sebenar, dan hampir tiada senario di mana proksi statik digunakan dalam pembangunan harian.
Analisis peranan:
Peranan abstrak: Secara umumnya, antara muka atau kelas abstrak digunakan untuk menyelesaikan masalah
Watak sebenar: watak ejen
Peranan ejen: ejen untuk watak sebenar Selepas berlakon untuk watak sebenar, kami biasanya melakukan beberapa operasi subsidiari
Pelanggan: Orang yang mengakses objek proksi!
Langkah kod:
1 Antara Muka
public interface Rent { public void rent(); }
2. Peranan ejen
//房东 public class Host implements Rent { public void rent() { System.out.println("房东要租房子"); } }
4. Akses pelanggan kepada peranan ejen
public class Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent(){ seeHouse(); host.rent(); fare(); } //看房 public void seeHouse(){ System.out.println("中介带你看房"); } //收中介费 public void fare(){ System.out.println("中介收费"); } }
Peranan sebenar akan menjana peranan proksi dari perspektif JVM, proksi statik menukar antara muka, kelas Pelaksanaan dan kelas proksi telah menjadi fail kelas sebenar.
2. Memperdalam pemahaman anda tentang
3 🎜>
Proksi dinamik mempunyai peranan yang sama seperti proksi statikBerasaskan antara muka— —JDK proksi dinamik
Anda perlu memahami dua kelas: Proksi: kelas proksi, InvocationHandler: pengendali panggilan
public class Client { public static void main(String[] args) { Host host = new Host(); //代理,代理角色一般会有附属操作! Proxy proxy = new Proxy(host); proxy.rent(); } }
Faedah proksi dinamik:
boleh menjadikan pengendalian aksara sebenar lebih tulen! Tidak perlu berurusan dengan beberapa perniagaan awam
//Proxy是生成动态代理类,提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。 //InvocationHandler-- invoke 调用处理程序并返回接口, 是由代理实例的调用处理程序实现的接口 。
1.
: Pemuat kelas, digunakan untuk memuatkan objek proksi. loader
2.: Beberapa antara muka yang dilaksanakan oleh kelas proksi;
3.interfaces
: Melaksanakan Objek antara muka
Untuk melaksanakan proksi dinamik, anda juga mesti melaksanakan untuk menyesuaikan logik pemprosesan. Apabila objek proksi dinamik kami memanggil kaedah, panggilan ke kaedah ini akan dimajukan ke kaedah h
kelas yang melaksanakan antara muka InvocationHandler
.
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){ }
InvocationHandler
1.InvocationHandler
proksi: kelas proksi yang dijana secara dinamikinvoke
2.kaedah: sepadan dengan kaedah yang dipanggil oleh objek kelas proksi
3.args: Parameter kaedah kaedah semasa
Contoh proksi dinamik1 Tentukan antara mukarreee
2 Antaramuka sewapublic interface InvocationHandler { Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
public interface Rent { public void rent(); }
: Apabila objek proksi dinamik kami memanggil kaedah asli, apa yang sebenarnya dipanggil ialah kaedah
dan maka kaedahmemanggil kaedah asli objek proksi bagi pihak kami.
4. Dapatkan kelas kilang objek proksiinvoke()
public class Host implements Rent { @Override public void rent() { System.out.println("房东要租房"); } }
invoke()
invoke()
: terutamanya mendapatkan objek proksi kelas tertentu melalui kaedah 5. Penggunaan sebenarpublic class DebugInvocationHandler implements InvocationHandler { /** * 代理类中的真实对象 */ private final Object target; public DebugInvocationHandler(Object target){ this.target = target; } /** * 当你使用代理对象调用方法的时候实际会调用到这个方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调用方法前 System.out.println("before method" + method.getName()); Object res = method.invoke(target, args); //调用方法后 System.out.println("after method" + method.getName()); return res; } }
getProxy()
Proxy.newProxyInstance()
Output menjalankan ejen di atas
sebelum methodrentTuan tanah ingin menyewaselepas methodrent
Atas ialah kandungan terperinci Contoh analisis proksi dinamik dan proksi statik dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!