最近本着不求甚解的态度重温了一下主流框架的源码,加上之前的笔记,所以趁热打铁的总结一下,学习框架或开发框架所必备的基础知识:
1、简介
- 代理的理解:代理是一种软件设计模式,通过代理的方式实现程序的扩展、修改和隐藏的等,具体上讲代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法
- 适应场景:
- 设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,那么这时我们就可以通过代理对类进行增强;
- 在使用和开发框架时,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 ,那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现,如Retrofit;
- Spring的AOP机制就是采用动态代理的机制来实现切面编程,即针对某一具体的操作拦截过程执行统一的处理回调,在埋点操作中使用
- 动态代理:在运行期动态创建代理类,相比静态代理有会更好的灵活性;
以上是对动态代理的简单介绍,对于AOP使用代理机制会在下一篇文章中进行详细介绍,本文主要将最基本的Java动态代理的实现
2、实现动态代理
- 动态代理实现AOP需要4个角色:
- 被代理类的接口:通过此接口作为代理的入口
- 被代理的类:AOP里所说的目标对象,也是接口真正的实现类,处理具体的业务逻辑
- 织入器:使用接口反射机制生成一个代理类,在这个代理类中织入代码
- InvocationHandler切面:包含了Advice和Pointcut,内部保存真实的对象,在增加或改变部分逻辑后再执行原来操作
上面是动态代理的四个元素,下面一个一个介绍并实现过程。
- 被代理类的接口
任意定义一个接口,此接口就问要代理的接口,将需要在运行时动态干涉的方法定义在接口内
/**
* 代理的接口
*/
interface Study {
fun studyEnglish()
fun studyMath()
}
- 被代理的类
实现了被代理接口的类
/**
* 实现的代理类
*/
class StudyImp : Study {
override fun studyEng