我们先聊下什么是代理,生活中我们经常会到超市去买东西。超市是从生产厂家拿货放到超市进行销售,而你不需要和生产厂家有接触就能买到生产厂家的东西。 简单的来说就是通过中间人去获取某个东西、或者做某件事。我们管这种思想叫做代理,英文proxy。
这种思想是面向对象编程中比较常见的思想,在java中我们管这种思想叫做代理模式。
代理可以分为两种,一种是静态代理:只能静态地代理某些类或者某些方法,比如代理创建对象的方式做代理,一般不推荐使用这种代理功能性比较弱。第二种是动态代理:动态代理又可以分成jdk动态代理和CGLIB动态代理。
cglib动态代理,可以理解为为我们的目标对象,生成.class字节码。cglib代理的实现方式有asm和Javassist,虽然cglib动态代理简化了开发,但是做得并不够极致。所以有了jdk的动态代理。
jdk动态代理,jdk的动态代理是通过反射进行实现的,通过newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)进行对象的代理,直接代理在内存当中,我们通过观察可以看到反射的第二个参数是接口,也就是说jdk代理只能代理到接口里的方法,对于类自己的实现表示无能为力。而cglib却可以解决这个问题。
所以两种动态代理的方式,各有优缺点。这个也是springAOP中为什么会用到两种动态代理,因为单个的代理有局限性。
页面更新:2024-06-06
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号