概念
代理模式可以屏蔽客户对原始对象(委托对象)的访问,是一种通过代理对象来间接控制原始对象的方式。类比翻墙,客户端实际是向代理发送请求 url ,再由代理发送到服务端,并接收返回数据返回到客户端。
根据代理类生成的时间,可以分为静态代理和动态代理:
- 静态代理:编译期生成代理类的 class 文件
- 动态代理:运行时生成,在编译期,并没有实际的代理类 class 文件。而是在程序运行时,动态生成类字节码,加载到 JVM 中
实现
一、静态代理
1 | package proxyPractice.staticProxy; |
二、动态代理
1. JDK原生动态代理
jdk的动态代理是java原生支持的,不需要任何依赖,但是只能基于接口进行代理。首先需要实现一个 InvocationHandler ,再动态获取代理对象。
1 | /** |
newProxyInstance()会返回一个实现了指定接口的代理对象,对该对象的所有调用,都会转发给 InvocationHandler.invoke()方法。
如果FaceBookWebService不实现WebService,那么可以使用CGLIB动态代理。
2. CGLIB动态代理
cglib 不是 jdk 自带的包,因此要先引入 jar 包,再实现一个 MethodInterceptor
1 | /** |
CGLIB动态代理是通过继承的方式进行代理,无法处理final方法。
案例
Spring AOP 使用了 jdk 动态代理和 CGLIB 动态代理,在运行时织入切面
aop的具体使用案例可以参考springboot学习笔记(一)