• Atitit 代理CGLIB 动态代理 AspectJ静态代理区别


    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

     

    1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表;而动态代理则以 spring AOP 为代表 1

    1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1

    1.3. CGLIB代理模式的缺点 static和final方法上应用横切关注点也是无法做到的。2

     

     

    1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表;而动态代理则以 spring AOP 为代表

     

    CGLIB动态代理 是可以针对接口与普通类(继承方式),底层使用ASM框架生成字节码完成代理功能 

    我在网上查资料说AspectJ是静态代理 在编译期间就生成了class文件完成了代理。这点容易理解一种编译的技术

     

     

    因为spring支持AspectJ风格的AOP 
    还是动态的,标注中用到的JoinPoint等类都来自aspectj包

     

    1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式

    JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式,一般采用前者,因为前者效率高。后者不建议使用,除非非用不可

     

    AOPAspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中临时生成 AOP 动态代理类,因此也被称为运行时增强

     

    区别只是生成 AOP 代理类的时机不同:AspectJ 采用编译时生成 AOP 代理类,因此具有更好的性能,但需要使用特定的编译器进行处理;而 Spring AOP 则采用运行时生成 AOP 代理类,因此无需使用特定编译器进行处理。由于 Spring AOP 需要在每次运行时生成 AOP 代理,因此性能略差一些。

     

    1.3. CGLIB代理模式的缺点 static和final方法上应用横切关注点也是无法做到的。

    因为Spring基于代理模式(使用CGLIB),它有一个使用限制,即无法在使用final修饰的bean上应用横切关注点。因为代理需要对Java类进行继承,一旦使用了关键字final,这将是无法做到的。

    例如,在Spring bean MyServicesImpl上使用关键字final,并配置一个“execution(public * *(..))”这样的切入点,将导致运行时异常(exception),因为Spring不能为MyServicesImpl生成代理。

    这种情况下,你也许会考虑使用AspectJ,其支持编译期织入且不需要生成代理。

    于此相似,在static和final方法上应用横切关注点也是无法做到的。因为Spring基于代理模式。如果你在这些方法上配置通知,将导致运行时异常,因为static和final方法是不能被覆盖的。在这种情况下,你也会考虑使用AspectJ,因为其支持编译期织入且不需要生成代理。

     

    AOP日志,记录调用类、方法、方法参数名称、方法参数值(包括对象和基本类型) - paincupid的专栏 - 博客频道 - CSDN.NET.html

     

     

    作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

    简称 Attilax Akbar 阿提拉克斯 阿克巴

    全名:Attilax bin Mahmud bin  attila bin Solomon Akbar Al Rapanui 

    阿提拉克斯  马哈茂德  阿提拉 所罗门 阿克巴 阿尔 拉帕努伊   

    常用名艾提拉(艾龙)   EMAIL:1466519819@qq.com

    转载请注明来源:attilax的专栏   http://blog.csdn.net/attilax

    --Atiend

     

  • 相关阅读:
    孙鑫vc++学习(vs2008)笔记之第五课文字处理程序
    lesson2 流水灯
    lesson1 预备知识
    第二章 寄存器(CPU工作原理)
    孙鑫vc++学习(vs2008)笔记之第一课Windows程序运行原理
    孙鑫vc++学习(vs2008)笔记之第二课掌握C++
    孙鑫vc++学习(vs2008)笔记之第三课MFC内部运行原理
    第一章 基础知识
    小小说(文摘)
    孙鑫vc++学习(vs2008)笔记之第四课MFC消息映射、画图
  • 原文地址:https://www.cnblogs.com/attilax/p/15198231.html
Copyright © 2020-2023  润新知