• 动态代理解析


    动态代理解析

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

    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
  • 相关阅读:
    UIImage的使用
    UIImageVIew的使用
    关于View和VIewController的关系和理解
    ZT Android 4.2蓝牙介绍
    2013深秋红土地旅行计划之井冈山
    系统性能优化
    Reorder List
    Word Break II
    iOS.CocoaPods.0
    Python 知识要点:案例:士兵突击
  • 原文地址:https://www.cnblogs.com/feng9exe/p/11557438.html
Copyright © 2020-2023  润新知