注:本文内容都来自互联网,通过自己整理用于学习,不作任何其他作用!
代理是什么?
把多个对象的业务,抽取集中到一个代理对象,实现了功能,简化了操作。
静态代理是什么?
代理模式最主要的就是有一个公共接口,一个实体类,一个代理类proxy
1
代理类可以通过和实体类共同实现一个接口来实现相同的功能
2
在代理类中假如实体类对象建立两者的联系
3
在代理类中调用实体类对象的公用接口方法。
以此来实现代理模式间接的调用实体类的方法。
好处:
可以在代理类中实现原有公共功能,同时实现了新功能的拓展。
动态代理是什么?
基于接口的动态代理
代理类由程序运行期间动态创建。
——
Proxy.newInstance(ClassLoader,Class接口字节码数组,InvocationHandler):创建代理实例对象。
——
ClassLoader参数:被代理对象的加载器,固定的。
——
Class<?>[] interface:字节码数组,共有接口。(让代理/被代理对象有相同的方法)
——
InvocationHandler:用于增强的代码,通常是写一个ih实现类,一般是匿名内部类。
——
增强的代码:新增的业务逻辑。写在invoke方法中,被代理对象放接口方法的前/后。
——
InvocationHandler中invoke(Proxy,Mehtod,Args):被代理对象的方法都会经过Invoke.
return:和被代理对象有相同的返回值
——
Proxy:代理对象,一般不用
Method:当前执行的方法
Args:方法参数
——
Method.invoke(object,args):
object:被代理对象
args:参数
——
InvocationHandler类:通过这个类把被代理对象的功能拿出来,同时可以被Proxy使用来创建一个代理对象。类似一个中间件,动态管理的中间件。
——
Proxy类:用来创建动态代理对象的类。
基于子类的动态代理
使用:
Enhance类的create方法
——
被代理的类不能是最终类
——
create方法的参数(Class,Callback)
Class:被代理对象的字节码
Callback:用于提供增强代码,和invoke类似。
通常使用接口的子接口实现类new MethodIntercept(proxy,method,args,methodProxy)参数和Invoke类似——
1.导入cglib依赖
——
2.在consumer类中,Producer p = (Producer)Enhance.create(produce.getClass(),new MethodInterceptor).
——
3.在MethodInterceptor中写入增强代码
4.用Producer代理p调用公有方法。
tip:在idea中右键Diagrams->Show Diagrams可以查看当前类的继承关系
选中接口,点击shou implements查看实现类。