3 Star 3 Fork 0

10km/aocache

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
aocache-core
aocache-maven-plugin
src/main/java/com/gitee/l0km/aocache/plugin
README.md
pom.xml
aocache
aocachez
images
.gitignore
LICENSE
README.md
README_aopanalyzer.md
aopanalyzer.ico
aopanalyzer.py
clean_mprj.sh
genexe.sh
pom.xml
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

aocache-maven-plugin

JDK Maven aocache专用的 静态织入插件,通过引用自动包重定位技术实现 AspectJ 切面的无缝集成 。

核心特性

智能包重定位 自动将 org.aspectj 重定向至 com.gitee.l0km.aocache.aspectj,彻底解决依赖冲突

双模块架构

  • aocache/aocachez:运行时库(内嵌 Shade 化 AspectJRT),aocachez为零依赖,同时内嵌Guava
  • aocache-core:静态织入专用切面库

全自动化配置 无需手动声明切面库路径,自动配置 aocache-core 切面库

快速开始

1. 添加依赖

<dependency>
    <groupId>com.gitee.l0km</groupId>
    <artifactId>aocache</artifactId>
    <version>0.5.0</version>
    <scope>runtime</scope>
</dependency>

2. 配置插件

<build>
    <plugins>
        <plugin>
            <groupId>com.gitee.l0km</groupId>
            <artifactId>aocache-maven-plugin</artifactId>
            <version>0.5.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <verbose>true</verbose>
            </configuration>
            <executions>
                <execution>
                    <goals><goal>compile</goal></goals>
                    <goals><goal>test-compile</goal></goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

wrapEnable 参数说明

aocache-maven-plugin定义了一个额外的参数wrapEnable用于控制ASM处理.class文件的工作模式。

参数定义

<configuration>
  <wrapEnable>true/false</wrapEnable> <!-- 默认值为 false -->
</configuration>

模式选择与特性对比

模式 优点 缺点
RELOCATE 模式 (wrapEnable=false) - 消除运行时对原生 aspectjrt 的依赖
- 不增加额外运行时性能开销
- 可能引发 AspectJ 版本冲突(如与其他切面库混用)
- 重定位后无法动态升级 AspectJ 版本
WRAP 模式 (wrapEnable=true) - 兼容其他 AspectJ 实现
- 允许动态升级 AspectJ 版本
- 需依赖原生 aspectjrt
- 高频调用时存在对象包装性能损耗

适用场景

  • RELOCATE 模式(推荐): 若项目为独立服务或中间件且无其他需要静态织入的切面库或切面定义依赖,简化依赖管理并提升性能。

    <wrapEnable>false</wrapEnable>
    
  • WRAP 模式: 在混合织入场景下,如项目需整合 Spring AOP 等第三方切面库,或需灵活调整 AspectJ 版本。

    <wrapEnable>true</wrapEnable>
    

技术原理

  1. 智能包重定位机制

基于ASM字节码改写技术,在aspectj-maven-plugin内核执行静态织入生成的class的基础上,进一步对class进行重定位修改。

  • RELOCATE 模式:对于class中所有aspectjrt库相关类引用执行全局替换,将 org.aspectj包路径重定向至com.gitee.l0km.aocache.aspectj,确保被织入类对AspectJ的引用指向aocache库内嵌的Shade化组件,彻底消除与应用项目其他AspectJ依赖的冲突。
    • 实现:通过RelocatingClassVisitor.java 修改 .class 文件中的类引用路径,将 org.aspectj.* 替换为 com.gitee.l0km.aocache.aspectj.*
    • 效果:屏蔽原生 AspectJ 依赖,内嵌指定版本(如 1.8.9)的兼容实现 。
  • WRAP 模式:在class中所有aocache切面方法调用(INVOKEVIRTUAL指令)的位置对JoinPoint/ProceedingJoinPoint类型参数插入 AspecjrtDecorator.wrap()包装指令,在class运行时将原生 org.aspectj.lang.JoinPoint 转换为重定位类型(com.gitee.l0km.aocache.aspectj.lang.JoinPoint)。
    • 实现:通过JoinPointWrapInjecter.java 在aocache切面方法调用点插入 JoinPoint jp = AspecjrtDecorator.wrap(rawJp) 指令。
    • 效果:保留对原生 aspectjrt 的引用,仅在运行时对aocache切面方法传递的JoinPoint/ProceedingJoinPoint参数动态适配重定位类型。
  1. 双模块协同架构
  • aocache-core:作为静态织入专用切面库,其aspectjrt依赖声明为compile,仅在编译时提供AspectJ注解支持
  • aocache/aocachez:运行时库,通过maven-shade-plugin内嵌重命名后的aspectjrt组件,形成不依赖AspectJ结构。静态织入阶段通过aocache-core生成增强字节码,运行时则无缝切换至aocache/aocachez内嵌组件
  1. 自动切面库发现 插件通过解析项目依赖树,自动增加com.gitee.l0km:aocache-core切面库定义。相比原生aspectj-maven-plugin需手动配置<aspectLibrary>的方式,本插件实现零配置织入。

  2. 编译时织入优化 基于改造后的aspectj-maven-plugin内核,在compile阶段完成以下操作流程:

源代码编译 → 加载aocache-core切面 → 正常静态织入 → 包名重定位/插入WRAP指令 → 生成最终字节码

该流程确保织入后的类文件与aocache运行时库完全兼容

技术优势

特性 aspectj-maven-plugin aocache-maven-plugin
包冲突解决方案 手动排除依赖 自动重定位包名
切面库配置 需显式声明 <aspectLibrary> 零配置自动发现
运行时依赖 需单独引入 AspectJRT 内嵌 Shade 化组件

除了<aspectLibraries><aspectLibrary></aspectLibrary></aspectLibraries>参数外, aocache-maven-plugin的其他配置参数与aspectj-maven-plugin保持一致

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/l0km/aocache.git
git@gitee.com:l0km/aocache.git
l0km
aocache
aocache
master

搜索帮助