Model agensi sebenarnya adalah untuk mencari pengganti Jika anda ingin melakukan sesuatu, jika anda tidak melakukannya sendiri, cari seseorang untuk melakukannya untuk anda. Ini adalah model agensi. Dalam program ini, pengganti disediakan untuk objek, dan pengganti dikawal untuk mengakses objek sasaran Kelebihan ini ialah sebagai tambahan kepada fungsi yang disediakan oleh objek sasaran, pengganti juga boleh melakukan lebih banyak kerja, iaitu. , fungsi objek sasaran boleh dikembangkan. Proksi boleh menjadi objek jauh, objek yang mahal untuk dibuat atau objek yang memerlukan kawalan keselamatan.
Mod proksi terbahagi terutamanya kepada tiga jenis berikut:
Proksi statik
Proksi dinamik (juga dipanggil JDK proksi, antara muka Proksi)
proksi cglib (juga tergolong dalam kategori proksi dinamik)
" 1. Pengenalan kepada proksi statik: "
Apabila menggunakan proksi statik, anda perlu menentukan antara muka atau kelas induk Objek proksi dan objek proksi perlu melaksanakan antara muka yang sama atau mewarisi kelas induk yang sama.
『2. Contoh aplikasi:』
Tentukan antara muka:
TeacherDao
mentakrifkan objek yang diproksikan:
TeacherDaoImpl
, perlu dilaksanakan
TeacherDao
Tentukan objek proksi:
TeacherDaoProxy
, juga perlu dilaksanakan
TeacherDao
untuk dipanggil
TeacherDaoImpl
kaedah, anda perlu menciptanya dahulu
TeacherDaoProxy
objek, kemudian buat
TeacherDaoImpl
Objek, kehendak
TeacherDaoImpl
Objek diserahkan
TeacherDaoProxy
Objek, kemudian laraskan kaedah yang berkaitan
TeacherDao.java:
<code>public interface TeacherDao {<br> void teach();<br>}<br></code>
TeacherDaoImpl.java:
<code>public class TeacherDaoImpl implements TeacherDao {<br> @Override<br> public void teach() {<br> System.out.println("今天又是没妹子的一天(ノへ ̄、)");<br> }<br>}<br></code>
TeacherDaoProxy.java:
<code>public class TeacherDaoProxy implements TeacherDao {<br> <br> private TeacherDao target; // 被代理的对象<br> <br> public TeacherDaoProxy(TeacherDao target){<br> this.target = target;<br> }<br> <br> @Override<br> public void teach() {<br> System.out.println("代理开始");<br> // 这里可以写一些额外的逻辑,以达到扩展被代理对象的目的,相当于spring的前置通知<br> target.teach();<br> // 这里也可以写一些额外的逻辑,以达到扩展被代理对象的目的,相当于spring的后置通知<br> System.out.println("代理结束");<br> }<br>}<br></code>
Client.java: Panggil objek proksi
<code>public class Client {<br><br> public static void main(String[] args){<br> // 创建被代理的对象<br> TeacherDao target = new TeacherDaoImpl();<br> // 创建代理对象<br> TeacherDaoProxy proxy = new TeacherDaoProxy(target);<br> // 通过代理对象调用方法<br> proxy.teach();<br> }<br>}<br></code>
「3. Kelebihan dan keburukan proksi statik:」
Kelebihan: Objek proksi boleh dilanjutkan tanpa mengubah suai objek proksi
Kelemahan: perlu melaksanakan antara muka yang sama atau mewarisi kelas induk yang sama, jadi akan terdapat banyak kelas proksi, dan jika antara muka atau kelas induk ditukar, objek proksi dan objek proksi Adakah kedua-duanya Penyelenggaraan diperlukan
「1 Objek proksi Jangan laksanakan antara muka, tetapi objek proksi masih perlu melaksanakan antara muka. Penjanaan objek proksi dinamik menggunakan API JDK dan kelas Proksi di bawah pakej pantulan untuk membina objek proksi secara dinamik dalam ingatan.
「2.java.lang.reflect.Proxy:」
Kelas ini mempunyai kaedah , yang menerima tiga parameter, seperti berikut:
<code>static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)<br></code>
newProxyInstance
『3. Contoh aplikasi:』
Tentukan antara muka: TeacherDao
rreee
<code>public interface TeacherDao {<br> void teach();<br>}<br></code>
<code>public class TeacherDaoImpl implements TeacherDao {<br> @Override<br> public void teach() {<br> System.out.println("今天又是没妹子的一天(ノへ ̄、)");<br> }<br>}<br></code>
<code>public class ProxyFactory {<br><br> private Object target; // 被代理的对象<br><br> public ProxyFactory(Object target){<br> this.target = target;<br> }<br><br> // 给被代理的对象生成一个代理对象<br> public Object getProxyInstance(){<br> // 参数1:指定被代理对象的类加载器<br> // 参数2:被代理对象实现的接口类型<br> // 参数3:事件处理,执行被代理对象的方法<br> return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {<br> @Override<br> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<br> System.out.println("JDK代理开始");<br> // 调用方法,args的方法的参数<br> Object returnValue = method.invoke(target, args);<br> System.out.println("JDK代理结束");<br> // 将执行结果return<br> return returnValue;<br> }<br> });<br> }<br>}<br></code>
Proksi statik dan proksi dinamik, dan objek yang diproksi, semuanya perlu melaksanakan antara muka Jika kelas tidak melaksanakan sebarang antara muka, maka proksi cglib mesti digunakan. Ejen cglib juga dipanggil ejen subkelas Ia membina objek subkelas dalam ingatan untuk memanjangkan objek proksi. Lapisan bawah ejen cglib menggunakan rangka kerja pemprosesan bytecode yang dipanggil ASM untuk menukar bytecode dan menjana kelas baharu untuk melaksanakan ejen. Kelas proksi tidak boleh muktamad, jika tidak ralat akan dilaporkan. Jika kaedah objek proksi adalah muktamad/statik, ia tidak akan dipintas, iaitu tiada kaedah perniagaan tambahan objek proksi akan dilaksanakan.
「2. Contoh aplikasi:」
首先要添加cglib相关依赖:
<code><dependency><br> <groupId>cglib</groupId><br> <artifactId>cglib</artifactId><br> <version>3.3.0</version><br></dependency><br></code>
TeacherDaoImpl.java:
<code>public class TeacherDaoImpl implements TeacherDao {<br> @Override<br> public void teach() {<br> System.out.println("今天又是没妹子的一天(ノへ ̄、)");<br> }<br>}<br></code>
CglibProxyFactory.java:
<code>// 需要实现MethodInterceptor并重写其方法<br>public class CglibProxyFactory implements MethodInterceptor {<br><br> private Object target;<br><br> public CglibProxyFactory(Object target){<br> this.target = target;<br> }<br><br> /**<br> * 返回target的代理对象<br> * @return<br> */<br> public Object getProxyInstance(){<br> // 1. 创建工具类<br> Enhancer enhancer = new Enhancer();<br> // 2. 设置父类<br> enhancer.setSuperclass(target.getClass());<br> // 3. 设置回调函数<br> enhancer.setCallback(this);<br> // 4. 创建子类对象,即代理对象<br> return enhancer.create();<br> }<br> @Override<br> public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {<br> System.out.println("CGLIB代理开始");<br> Object returnValue = method.invoke(target, args);<br> System.out.println("CGLIB代理结束");<br> return returnValue;<br> }<br>}<br></code>
Client.java:通过代理调用方法
<code>public class Client {<br><br> public static void main(String[] args){<br> // 创建被代理的对象<br> TeacherDaoImpl target = new TeacherDaoImpl();<br> // 获取代理对象,并将被代理对象传给代理对象<br> TeacherDaoImpl proxy = (TeacherDaoImpl) new CglibProxyFactory(target).getProxyInstance();<br> // 执行方法,触发intecept方法,从而实现执行被代理对象的方法<br> proxy.teach();<br> }<br>}<br></code>
Atas ialah kandungan terperinci Bagaimana untuk menggunakan mod proksi java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!