spring jdk动态代理、Cglib动态代理和LoadTimeWeaver(LTW)的应用选择
在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。
AspectJ采用编译期织入和类加载期织入的方式织入切面,是语言级的AOP实现,提供了完备的AOP支持。它用AspectJ语言定义切面,在编译期或类加载期将切面织入到Java类中。
AspectJ提供了两种切面织入方式,第一种通过特殊编译器,在编译期,将AspectJ语言编写的切面类织入到Java类中,可以通过一个Ant或Maven任务来完成这个操作;第二种方式是类加载期织入,也简称为LTW(Load Time Weaving)。
如何使用Load Time Weaving?首先,需要通过JVM的-javaagent参数设置LTW的织入器类包,以代理JVM默认的类加载器;第二,LTW织入器需要一个 aop.xml文件,在该文件中指定切面类和需要进行切面织入的目标类。
在做spring项目时,如果代理对象是单例模式,选择cglib动态代理;如果是prototype模式,选择jdk动态代理。
一般不会用到Load Time Weaving代理。
但是,一些特殊情况jdk和cglib动态代理也有局限性,一些特殊情况只能选择Load Time Weaving代理。
jdk动态代理的局限:
因为jdk代理是 基于接口的动态代理技术,由于接口的方法都必然是public的,这就要求实现类的实现方法也必须是public的(不能是 protected、private等),同时不能使用static的修饰符。所以,可以实施jdk动态代理的方法只能使用public或public final修饰符的方法,其他方法不可能被动态代理,相应的也就不能实施AOP增强,换句话,即不能进行spring 增强了。
Cglib动态代理的局限:
基于Cglib字节码动态代理是通过扩展被增强类,动态创建其子类的方式进行AOP增强植入的。由于使用final、static、private修饰符的方法不能被子类覆盖,相应的,这些方法就无法实施AOP增强。
总结:jdk动态代理创建时效率比cglib高,但执行效率比cglib低。所以如果代理对象是单例模式,选择cglib动态代理;如果是prototype模式,选择jdk动态代理。
当遇到jdk和cglib代理局限性无法解决问题时,可以选择Load Time Weaving代理。
至于,aspectj 的Load Time Weaving技术的效率,没研究过,请大牛解惑。
spring jdk动态代理、Cglib动态代理和LoadTimeWeaver(LTW)的应用选择相关推荐
- Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...
- java jdk动态代理 cglib动态代理demo
最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo jdk动态代理实现: View Code import ...
- 动态代理——CGLIB动态代理原理示例解析
觉得可以的话点个关注,转个发呗,陆续奉上干货~~~~ 前文我们讲解了JDK动态代理的原理(动态代理--JDK动态代理原理),今天我们来看看CGLIB动态代理是如何实现,最后我们总结下JDK动态代理和C ...
- 什么是动态代理?动态代理有哪些应用?如何编写动态代理案例
什么是动态代理? 当我们需要给某个类或者接口中的方法添加一些额外的功能比如日志.事务的时候,可以通过创建一个代理类来实现这些功能:该代理类既包含了原有类的完整功能,同时在这些功能的基础上添加了其他的逻 ...
- 动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理
为什么80%的码农都做不了架构师?>>> 一:在看此篇代码示例前,先看静态代理, 链接地址:http://my.oschina.net/dyyweb/blog/656760 ...
- 静态代理,cglib动态代理,jdk动态代理区别以及流程详解
1.静态代理 静态代理使用的是代理设计模式,不讲高大上的思想,我们直接实战 这是动物接口,其中有一个吃饭方法 这是其中的一只动物,实现了动物接口,覆盖了吃饭方法 现在我们思考,我想要给猫找一个代理,希 ...
- Proxy 代理模式 动态代理 CGLIB
代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...
- 03、动态代理--CGLib引入增强
package com.offer.note.Java基础.动态代理.CGLib引入增强;public interface Browser {void visitInternet(); } packa ...
- java代理(静态代理和jdk动态代理以及cglib代理)
说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...
最新文章
- yum配置代理,通过CCProxy有线网络安装软件
- WGS 1984 Web Mercator 对于在线地图服务的意义
- KPROCESS 结构体属性介绍
- 一个例子带你搞懂python作用域中的global、nonlocal和local
- MySql查询系统时间,SQLServer查询系统时间,Oracle查询系统时间
- 黑色炫酷粒子动态html网站源码
- 2017 开源软件排行_2017年最佳开源教程
- 无心剑中译切尼《当代的悖论》
- Redis应用(四)——在Spring框架中的应用
- python 弧度与角度互转
- PHP 配置open_basedir,让各虚拟站点独立运行
- 初试牛刀的收获-freetextbox的应用
- 最短路径spfa算法
- 如何安装虚拟光驱大学计算机考试,用虚拟光驱安装win10专业版的方法
- 夜神模拟器解决apk无法安装的问题
- 基于QT5、C/S(客户端/服务器)架构的MiniQQ项目开发
- Java自动装箱与自动拆箱(包装类)以及Integer和Double的valueOf()源码分析
- PySpark处理数据并图表分析
- Java计算平均成绩
- 量子计算机叠加算法,量子计算中的叠加
热门文章
- 概率论基础-条件概率、全概率公式、贝叶斯公式
- 算法竞赛入门10.2计数与概率基础例题代码
- 概率论与数理统计【二】随机事件与概率(2) - 常用求概率公式与例题两道
- 如何使用BurpSuite
- 前端三剑客之——javaScript
- linux切换用户su自动输入密码,Linux切换用户出现【su:命令鉴定故障】问题修改的密码位数必须大于8位的问题...
- 【BZOJ 2563】 阿狸和桃子的游戏 脑洞+贪心
- c语言中long输入字符串,C语言strtol函数
- Hibernate中的packagesToScan路径解析分析
- Avast 导致 VMware 虚拟机无法上网解决方法