LWT
1 . AOP切面织入方式
- 编译时:例如使用AspectJ编译器。
- 加载时:即本文介绍的AspectJ的LoadTimeWeaving (LTW)。
- 运行时:Spring AOP默认方式,通过动态代理或cglib
2 .介绍
LWT,即运行时织入(Load-time Weaving),是Spring框架中面向切面编程(AOP)的一种实现方式。
3. 原理
使用JDK5新增的java.lang.instrument
包,在类加载时对字节码进行转换,从而实现AOP功能。
- 字节码转换:在应用程序加载到JVM之前,LWT工具会读取并转换应用程序的字节码。这个转换过程包括识别目标类、定位需要织入的切面以及生成修改后的字节码。
- 切面织入:在字节码转换过程中,LWT工具会将切面中的增强逻辑(如前置通知、后置通知、环绕通知等)织入到目标类的相应方法中。这个织入过程是通过修改目标类的字节码来实现的,因此它可以在运行时动态地改变类的行为。
- 类加载:经过转换后的字节码会被JVM加载到内存中,并作为应用程序的一部分执行。在执行过程中,JVM会调用已经织入切面的目标类方法,从而触发增强逻辑的执行。
4. 依赖库
- 需要spring-AOP和aspectJ库,JDK 8及以上版本
5. 优势与特点
- 灵活性:运行时织入不需要在编译阶段对目标类进行修改,因此可以在不改变源代码的情况下为现有应用程序添加新的切面逻辑。
- 动态性:由于织入过程发生在运行时,因此可以根据应用程序的运行时状态动态地决定是否应用某个切面逻辑。
- 解耦:通过运行时织入,可以将与业务逻辑无关的通用横切关注点(如日志记录、性能监控、事务管理等)与业务逻辑相分离,从而实现代码复用和解耦。
6. 应用场景
运行时织入适用于需要在运行时动态地应用切面逻辑的场景,例如:
- 日志记录:在应用程序运行时动态地记录方法调用日志,以便进行故障排查和性能分析。
- 性能监控:在应用程序运行时动态地监控方法的执行时间、内存使用等性能指标,以便及时发现性能瓶颈并进行优化。
- 事务管理:在应用程序运行时动态地管理事务的开启、提交和回滚等操作,以确保数据的完整性和一致性。
7. 启动VM参数
为了使LTW生效,需要在启动VM时添加参数,如-javaagent:path\spring-instrument-5.1.6.RELEASE.jar
和-javaagent:path\aspectjweaver-1.9.2.jar
,其中path
需要替换为本地路径。