一、概念
1、定义
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。同时代理对象可以调用被代理对象的方法,并对其进行增强。可以总结为代理对象 = 增强代码 + 被代理(原对象)
2、场景
切面模式
二、静态代理
1、步骤
- 定义接口:被代理类和代理类都需要实现该接口
- 定义被代理类:实现上面定义的接口
- 定义代理类:(1)实现上面定义的接口 (2)创建被代理对象(3)调用方法时需要调用被代理对象的方法,同时自己可以对方法进行增加
2、问题
如果一个类需要被代理,就得去创建一个代理类。如果被代理的类过多,这样就需要手动创建很多代理类。为了解决这个问题,便有了动态代理
三、基于Java反射的动态代理
1、反射和类加载机制,Java动态代理是面向接口的代理模式****
2、使用反射实现动态代理
- 通过getProxyClass获得代理对象的Class对象(接口+对应的构造函数)
- 通过Class对象调用得到构造方法。 Constructor<?> constructor = proxyClazz.getConstructor(InvocationHandler.class)
- 构造方法去创建实例,构造方法传入InvocationHandler实例,需要实现其invoke方法
- 通过代理对象调用方法
四、基于CGLib的动态代理
- CGlib可以传入接口也可以传入普通的类,接口使用实现的方式,普通类使用会使用继承的方式生成代理类
- CGLIB 原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。
- CGLIB 底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
- 7.CGLIB缺点:对于final方法,无法进行代理。