java代理模式

代理

代理模式就是使用代理技术动态生成一个类

两种代理方式

有两种代理实现,一种是jdk自带的动态代理,另一种是cglib实现的代理

jdk实现的过程是拿到需要实现的接口(可以使多个接口)以及具体的InvocationHandler,然后使用字节码拼成一个全新的类,这个类的内部有接口的所有方法,每个方法的实现相同,都是调用InvocationHandler,jdk的动态代理只能代理接口,不能代理普通类

cglib实现的过程依旧是拿到需要实现的接口(可以使多个接口)或者普通类以及具体的MethodInterceptor ,然后通过字节码拼成一个新的代理类,这个代理类是继承自目标类,然后使用MethodInterceptor复写其中的方法,cglib的代理不仅可以代理接口,还可以代理普通类

代理工作原理

代理的对象在使用的时候,无论调用哪个方法,都会调用创建代理类时的那个InvocationHandler,其中三个参数proxy就是代理的对象,一般很少用到,method的调用的方法信息,args是传入的参数

代理具体用途

目前加过的食用方法有两种,一种是xxl的使用方法,InvocationHandler的实现为拿到方法信息后使用HttpClient发送至远端,实现RPC,第二种是像spring的通知一样,代理一个对象,比如前置通知,InvocationHandler的实现就是两步,第一步先调用你的通知方法,第二步调用目标类的方法

spring如何选择代理

spring会动态的选择代理的类型,当目标类有实现接口,那就使用jdk的方式,只是普通类的话就使用cglib