5-1 代理模式与静态代理
面试官经常会问aop底层实现的原理是什么?
此时就涉及了一个核心问题什么是代理模式
先从静态代理来切入
通过代码演示
不需要依赖
新建用户服务类接口
新建类
调用
希望将这个方法执行的时间提取出来该怎么办?代理模式怎么做?
就必须基于UserService接口创建对应的代理类,同时在代理类中去持有与之对应的具体实现
参数userservice是在我们代理类实例化的时候从外侧传入进来的
创建代理对象的时候通过外侧传入的某一个userService的实现类为内部的委托类赋值就相当于是有委托类的对象了,不要忘记代理类和委托类都要实现相同的接口,实现方法,因为有了委托类的对象,我么可以发起委托类具体的职责,还可以扩展其他的代码对系统当前时间进行输出,这样就相当于在执行目标方法前打印出当前方法的执行时间
为什么要在构造方法中持有一个userService 接口的某一个实现类呢?这里写具体的实现类UserService impl可不可以呢?可以但不建议,因为作为代理模式是可以嵌套使用的
委托类和代理类都实现了相同的接口同时在创建接口的时候都允许传入对应接口的实现类
在额外的创建一个全新的代理
就意味着有了两个代理类一个是在方法前一个是在方法后
内部不管你是什么对象只要实现了userService都可以传入其中,所以具体的传入对象这里就可以是一个代理对象,在代理对象中在传入真正的业务执行类,像这样就实现了功能的扩展
但是每进行一次功能的扩展都要创建一个代理类,这样有一个坏处随着功能的扩大,每个实现类都要至少有一个代理类,而这个代理类是要自己按照规则书写的,如果有成百上千个实现类就要有成百上千的代理类,十分麻烦,有手动就有自动下一节说自动创建
5-2 AOP底层原理-JDK动态代理
无需添加依赖组件
创建类
实现接口,和方法invoke
学习反射的时候通过invoke调用目标方法
怎么使用?
如何运行?必须基于代理类
5-3 JDK动态代理解析
解答一下关于jdk底层原理和实现的细节
proxy的作用就是根据已有的接口来生成对应的代理类
5-4 AOP底层原理-CGLib
什么是cglib?
演示
可以知道他是通过cglib来实现类的增强,而cglib的原理是在原始目标类上进行继承,然后重写每一个方法来实现的增强
稍微改造一下
自动生成
类型改变 ,正是因为实现了接口所以spring优先选择jdk动态代理来实现功能的增强