动态代理解析

动态代理解析

动态代理:确定的实现机制

1、代理机制

具有相同接口的容器类;

2、动态:

1)动态生成代理类

2)动态完成替换;

代理职责:

添加额外的功能;比如日志等;

前提是代理职责的有限性和确定性。

可以根据配置文件和其它额外信息来动态生成这些功能。

 
作者:FeelsChaotic
链接:https://www.zhihu.com/question/40777626/answer/588526172
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. AspectJ 属于静态织入,原理是静态代理

2. Cglib、JDK 动态代理属于动态织入,原理是动态代理

3. 而 ASM 只是一个字节码操作的工具,静态还是动态就看你在哪个阶段利用它。

首先说说静态织入:作用于编译期,字节码加载前,性能优于动态织入。AspectJ 用一种特定语言编写切面,通过自己的语法编译工具 ajc 编译器来编译,生成一个新的代理类,该代理类增强了业务类。

第二说下动态织入:作用于运行期,字节码加载后,使用了反射,所以性能较差。Spring 底层的动态代理分为 Cglib 和 JDK 代理,为什么要分两种?

1. JDK 动态代理用于对接口的代理,动态产生一个实现指定接口的类,注意动态代理有个约束目标对象一定是要有接口的,没有接口就不能实现动态代理,只能为接口创建动态代理实例,而不能对类创建动态代理。

2. CGLIB 用于对类的代理,把被代理对象类的 class 文件加载进来,修改其字节码生成一个继承了被代理类的子类。注意,修改了字节码,所以需要依赖 ASM 包,使用 cglib 就是为了弥补动态代理的不足。

那有的小伙伴可能有疑问,Spring AOP 使用了 AspectJ,怎么是动态代理呢?

实际上,Spring 只是使用了与 AspectJ 一样的注解,没有使用 AspectJ 的编译器 ,转向采用动态代理技术的实现原理来构建 Spring AOP 的内部机制(动态织入),这是与 AspectJ(静态织入)最根本的区别。

 
https://www.zhihu.com/question/40777626
原文地址:https://www.cnblogs.com/feng9exe/p/11557438.html