首页 / JAVA / Java的两种动态代理,你真的懂么?
Java的两种动态代理,你真的懂么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java的两种动态代理,你真的懂么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3025字,纯文字阅读大概需要5分钟。
内容图文
![Java的两种动态代理,你真的懂么?](/upload/InfoBanner/zyjiaocheng/822/cb161d22cba54a118c3aeb46526f4f6a.jpg)
BigDataKer 2019-05-23 08:30:00
Spring主要有两大思想,一个是IOC,另一个就是AOP。对于Spring的核心AOP来说,AOP的原理就是java的动态代理机制来实现,所以本篇主要对java动态代理做一个简单介绍.
1、代理(Dynamic Proxy)
代理分为静态代理和动态代理,静态代理是在编译时就将接口、实现类、代理类一股脑儿全部手动完成,但如果我们需要很多的代理,每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码,此时我们就可以采用动态代理。动态代理可以在程序运行期间根据需要动态的创建代理类及其实例,来完成具体的功能。
其实方法直接调用就可以完成功能,为什么还要加个代理呢?
原因是采用代理模式可以有效的将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部。
2、代理实现的一般模式
其实代理的一般模式就是静态代理的实现模式:首先创建一个接口(JDK代理都是面向接口的),然后创建具体实现类来实现这个接口;再创建一个代理类同样实现这个接口。不同之处在于,具体实现类的方法中需要将接口中定义的方法的业务逻辑功能实现,而代理类中的方法只要调用具体类中的对应方法即可。这样我们在需要使用接口中的某个方法的功能时直接调用代理类的方法即可,将具体的实现类隐藏在底层。
一般而言,动态代理分为两种,一种是JDK反射机制提供的代理,另一种是CGLIB代理。在JDK代理,必须提供接口,而CGLIB则不需要提供接口,在Mybatis里两种动态代理技术都已经使用了,在Mybatis中通常在延迟加载的时候才会用到CGLIB动态代理。
1.JDK动态代理:
public interface Rent { public void rent(); }
public class Landlord implements Rent{ @Override public void rent() { System.out.println("房东要出租房子了!"); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Intermediary implements InvocationHandler{ private Object post; Intermediary(Object post){ this.post = post; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(post, args); System.out.println("中介:该房源已发布!"); return invoke; } }
import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Rent rent = new Landlord(); Intermediary intermediary = new Intermediary(rent); Rent rentProxy = (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), intermediary); rentProxy.rent(); } }
2.CGLIB动态代理:
public class Landlord { public void rent(){ System.out.println("房东要出租房子了!"); } }
import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class Intermediary implements MethodInterceptor { @Override public Object intercept(Object object, Method method, Object[] args,MethodProxy methodProxy) throws Throwable { Object intercept = methodProxy.invokeSuper(object, args); System.out.println("中介:该房源已发布!"); return intercept; } }
import net.sf.cglib.proxy.Enhancer; public class Test { public static void main(String[] args) { Intermediary intermediary = new Intermediary(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Landlord.class); enhancer.setCallback(intermediary); Landlord rentProxy = (Landlord) enhancer.create(); rentProxy.rent(); } }
本文转载于博客园如果屈原会编程的博客
内容总结
以上是互联网集市为您收集整理的Java的两种动态代理,你真的懂么?全部内容,希望文章能够帮你解决Java的两种动态代理,你真的懂么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。