好像没啥特点
JDK动态代理
代理类与委托类实现同一接口,主要是通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中将对方法进行增强处理
不需要硬编码接口,代码复用率高
只能够代理实现了接口的委托类
底层使用反射机制进行方法的调用
CGLIB动态代理
代理类将委托类作为自己的父类并为其中的非final委托方法创建两个方法,一个是与委托方法签名相同的方法,它在方法中会通过super调用委托方法;另一个是代理类独有的方法 。在代理方法中,它会判断是否存在实现了MethodInterceptor接口的对象,若存在则将调用intercept方法对委托方法进行代理
可以在运行时对类或者是接口进行增强操作,且委托类无需实现接口
不能对final类以及final方法进行代理
底层将方法全部存入一个数组中,通过数组索引直接进行方法调用
代理方式
实现
优点
缺点
特点
JDK静态代理
代理类与委托类实现同一接口,并且在代理类中需要硬编码接口
实现简单,容易理解
代理类需要硬编码接口,在实际应用中可能会导致重复编码,浪费存储空间并且效率很低
好像没啥特点
JDK动态代理
代理类与委托类实现同一接口,主要是通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中将对方法进行增强处理
不需要硬编码接口,代码复用率高
只能够代理实现了接口的委托类
底层使用反射机制进行方法的调用
CGLIB动态代理
代理类将委托类作为自己的父类并为其中的非final委托方法创建两个方法,一个是与委托方法签名相同的方法,它在方法中会通过super调用委托方法;另一个是代理类独有的方法 。在代理方法中,它会判断是否存在实现了MethodInterceptor接口的对象,若存在则将调用intercept方法对委托方法进行代理
可以在运行时对类或者是接口进行增强操作,且委托类无需实现接口
不能对final类以及final方法进行代理
底层将方法全部存入一个数组中,通过数组索引直接进行方法调用
问题CGlib比JDK快?
- 使用CGLiB实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,在jdk6之前比使用Java反射效率要高 。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类 。
- 在jdk6、jdk7、jdk8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLIB代理效率 。只有当进行大量调用的时候,jdk6和jdk7比CGLIB代理效率低一点,但是到jdk8的时候,jdk代理效率高于CGLIB代理,总之,每一次jdk版本升级,jdk代理效率都得到提升,而CGLIB代理消息确有点跟不上步伐 。
- 当Bean实现接口时,Spring就会用JDK的动态代理 。
- 当Bean没有实现接口时,Spring使用CGlib实现 。
- 可以强制使用CGlib
- 干货 | 教你学会拍摄金黄色的秋天
- 小吃店起火今日 山东一小吃街凌晨起火 整条街被烧光 新闻
- 山东的特产小吃 山东特产排行榜前十名送礼
- 夜市摆摊什么最好卖利润高小吃 夜市摆摊卖什么
- 坚果小吃 坚果类的食物有哪些?
- 大栅栏小吃十大必吃,寻访大栅栏的老字号小吃
- 北京大栅栏街有哪些值得推荐的小吃或美食 北京大栅栏小吃
- 济南小吃排行榜前十名 济南特色美食小吃排名
- 阳泉批发小零食店 阳泉特产小吃可携带的
- 洛阳小吃培训基地 洛阳小吃排名前十及地址
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
