Spring系列之(七)动态代理

动态代理

1. 特点

字节码随用随创建,随用随加载

2. 作用

不修改类的源码基础上对类的方法进行增强

3. 分类

  1. 基于接口的动态代理
  2. 基于子类的动态代理

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中导入坐标
在这里插入图片描述
被代理类
在这里插入图片描述
在这里插入图片描述
测试结果
在这里插入图片描述

动态代理彻底将业务层代码和事务管理进行分离,解决了方法间的依赖问题

posted @   刘二水  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示