博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Atitit 代理CGLIB 动态代理 AspectJ静态代理区别
阅读量:6083 次
发布时间:2019-06-20

本文共 1606 字,大约阅读时间需要 5 分钟。

 

 

 

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

 

 

 

1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表;而动态代理则以  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://www.cnblogs.com/attilax/

--Atiend

 

 

你可能感兴趣的文章
数据结构占坑
查看>>
【Laravel】安装并且运行
查看>>
设计模式之代理模式(一)
查看>>
My platform info!
查看>>
Xcode 8 : iOS xib is missing from working copy、iOS misssing file
查看>>
网关服务Spring Cloud Gateway(二)
查看>>
Java链接DB2的4种基本类型【转】
查看>>
【转】Beginning Game Programming v2.0
查看>>
IntelliJ IDEA 创建 java Maven项目
查看>>
Axure 简单原型设计
查看>>
设备驱动层
查看>>
git的常用命令
查看>>
HttpClient-4.3.X 中get和post方法使用
查看>>
怎么才能让数学公式编辑的简洁整齐?
查看>>
MathType编辑双向斜箭头的教程
查看>>
中国足球
查看>>
windows本机域名配置
查看>>
Java编程基础-反射
查看>>
yarn+webpack+react
查看>>
Linux与VMwareTools与hgfs权限问题
查看>>