动态代理解析
动态代理:确定的实现机制
1、代理机制
具有相同接口的容器类;
2、动态:
1)动态生成代理类
2)动态完成替换;
代理职责:
添加额外的功能;比如日志等;
前提是代理职责的有限性和确定性。
可以根据配置文件和其它额外信息来动态生成这些功能。
作者:FeelsChaotic
- 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
------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。