代理模式
给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问。
什么是动态代理
运行时动态生成代理类。
动态代理我们需要些什么
1.业务接口(Interface)
业务的抽象表示。
2.业务具体实现类(concreteManager)
实现业务接口,执行具体的业务操作。
3.业务代理类($proxy,在运行的时候动态生成的类)
进行业务代理,调用业务代理操作类。
4.业务代理操作类(proxyHandler,实现了InvocationHandler接口的类)
代理方法的直接调用者,通过InvocationHandler中的invoke方法直接发起代理。
5.客户端调用对象(client)
发起业务。
Java动态代理、cglib动态代理
按照代理的创建时期,代理类可以分为两种:
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
动态代理是基于什么原理?
动态代理是基于反射机制,在程序运行时,动态构建代理、动态处理代理方法调用的机制。很多场景都是利用类似机制做到的,比如用来包装RPC调用、面向切面的编程(AOP)。
实现动态代理的方式很多,比如JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用更高性能的字节码操作机制,CGLIB(基于ASM)。
代理机制
首先,动态代理是一个代理机制。
代理可以看作是对调用目标的一个包装,这样,我们对目标代码的调用不是直接发生的,而是通过代理完成的。
通过代理可以让调用者与实现者之间解耦。比如进行RPC 调用,框架内部的寻址、序列化、反序列化等,对于调用者往往是没有太大意义的,通过代理,可以提供更加友好的界面。