动态代理解析

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

 

1、代理机制

具有相同接口的容器类;

 

2、动态:

1)动态生成代理类

2)动态完成替换;

 

代理职责:

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

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

 

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


 


作者:FeelsChaotic



  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


------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。