动态代理
1. 特点
字节码随用随创建,随用随加载
2. 作用
不修改类的源码基础上对类的方法进行增强
3. 分类
- 基于接口的动态代理
- 基于子类的动态代理
4. 基于接口的动态代理
4.1 涉及的类
Proxy
4.2 提供者
JDK官方
4.3 如何创建代理对象
Proxy的newProxyInstance方法
4.4 创建代理对象的要求
被代理类最少实现一个接口,如果没有则不能使用
4.5 newProxyInstance方法的参数
参数 | 功能 | 写法 |
---|---|---|
ClassLoader loader | 用于加载代理对象的字节码 | 被代理类的对象的类加载器,写法固定 |
Class<?>[] interfaces | 用于让代理对象和被代理对象有相同方法 | 被代理类的实现接口,固定写法 |
InvocationHandler h | 用于提供增强的代码 | 一般是InvocationHandler接口的实现类,通常情况下是匿名内部类,但不必须,该接口的实现类都是谁用谁写 |
注:匿名内部类使用成员变量,要求成员变量是被final修饰的 |
4.6 InvocationHandler接口中的invoke方法
通过代理对象调用被代理对象的任何接口方法都会经过该方法
4.6.1 参数含义
参数 | 功能 |
---|---|
Object proxy | 代理对象的引用,一般用不到 |
Method method | 当前执行的方法 |
Object[] args | 当前执行方法所需的参数 |
4.6.2 返回值含义
和被代理对象方法有相同的返回值
4.7 实现
IProducer接口
IProducer实现类
测试结果
5. 基于子类的动态代理
5.1 涉及的类
Enhancer
5.2 提供者
第三方cglib库
5.3 如何创建代理对象
Enhancer的create方法
5.4 创建代理对象的要求
被代理类不能是最终类,即被代理类是可以被继承的
5.5 create方法的参数
参数 | 功能 | 写法 |
---|---|---|
Class type | 用于加载代理对象的字节码 | 被代理类的对象的字节码,写法固定 |
Callback callback | 用于提供增强的代码 | 一般是Callback接口的子接口MethodInterceptor的实现类,通常情况下是匿名内部类,但不必须,该接口的实现类都是谁用谁写 |
注:匿名内部类使用成员变量,要求成员变量是被final修饰的 |
5.6 MethodInterceptor接口中的intercept方法
通过代理对象调用被代理对象的任何接口方法都会经过该方法
5.6.1 参数含义
参数 | 功能 |
---|---|
Object o | 代理对象的引用,一般用不到 |
Method method | 当前执行的方法 |
Object[] objects | 当前执行方法所需的参数 |
MethodProxy methodProxy | 当前执行方法的代理对象,一般用不到 |
5.6.2 返回值含义
和被代理对象方法有相同的返回值
5.7 实现
pom中导入坐标
被代理类
测试结果
动态代理彻底将业务层代码和事务管理进行分离,解决了方法间的依赖问题
标签:对象,Spring,代理,接口,参数,动态,方法 From: https://www.cnblogs.com/wzzzj/p/18038228