版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwz45698752/article/details/85916224
文章目录
动态代理概述
- 由代理类决定何时及如何调用被代理类
- 被代理类要完成接口定义的功能——》创建代理类,实现接口(不同接口则要不同的代理类)
- 编译期不用确定代理类类型,运行时根据被代理类动态创建代理类
- 被代理类实现某接口——》代理类动态实现该接口——》代理目标对象
静态代理实例
- 声明是接口类型,实际传入被代理类对象,进行实例化
- 参考接口章节
- 新的接口——》创建接口实现类(目标类,即被代理类)——》创建代理类(同样实现接口)
- 代理类和被代理类配套使用(都实现某接口)
动态代理实例
- 关注一个接口和类的一个静态方法
- 通过Proxy的静态方法来动态形式返回代理类,在该静态方法中,动态获取接口和类加载器,使得二者相同,最后一个参数要求是实现了特定接口(InvocationHandler)的一个对象
- 动态创建——》不知道接口定义的抽象方法——》通过invoke方法实现
- 所谓动态代理,指的是动态创建代理类,而不是直接实现接口来创建一个代理类
- invoke方法的返回值即method方法的返回值
- 调用obj对象相应的方法,即method
- 每当代理类对象(sub/proxyCloth)调用被重写的方法(action/productCloth)时,转化为对invoke方法的调用(换句话说,调用invoke方法实际上调用被重写的方法(即method,动态方式获取),此处为action/productCloth方法),进而调用被代理类重写的方法,实现动态代理
- 动态方式创建,未知类型——》返回值为Object类型,但又要调用被重写的方法(action/productCloth),所以要强转,而real对应的类(RealSubject)在本例中只实现了subject接口——>强转为Subject
动态代理和AOP编程
- 前端:struts
- 后台:与服务端交互(涉及到数据库):Hibernate
- 中间:spring,负责前端和后台的整合(设计AOP)
-
AOP:面向切面的编程(动态变化)
-
只知道某位置要调用方法,但不写明是谁,运行时决定
-
想要在方法一和二之间添加一个方法,
-
固定代码之间——》加入一段动态方法(即method方法,如本例中的fly和info方法)
- 通过invoke方法来回调,invoke来调用动态方法
- 把此接口理解为:当代理类调用重写方法(接口定义)转为调用被代理类的重写方法(invoke方法内定义为什么就转化为什么,本例为在方法1和方法2之间插入被代理类的重写方法)
- 实现InvocationHandler接口类要有被代理类的对象引用和转化的内容
- 用于动态创建代理类对象
- 传入对象——》setObject方法使之成为被代理类对象
- 静态方法newProxyInstance使得handler和代理类关联起来——》代理类代理被代理类
- 传入一个对象作为被代理类对象,返回代理类对象
总结
- 创建实现接口(InvocationHandler)的类,在该类的invoke方法内说明转化的内容(见下文解释)及代理哪个对象
- **当代理类调用重写方法(接口定义)转为调用被代理类的重写方法(invoke方法内定义为什么就转化为什么)(**当代理类调用重写方法(接口定义)转为调用被代理类的重写方法(invoke方法内定义为什么就转化为什么
- 静态方法newProxyInstance使得实现接口(InvocationHandler)的类的对象和代理类关联起来——》创建代理类来代理被代理类