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

 

原文地址:https://www.cnblogs.com/attilax/p/15198231.html