AspectJ在Gradle的CTW案例
AspectJ的运行方式主要有三种:
- CTW(Compile Time Weaving)
编译时织入,依托
构建工具(maven/gradle等)和AJC(AspectJ Compiler),在项目编译时修改字节码 - LTW(Load Time Weaving)
加载时织入,依托
Java Agent机制,在ClassLoader加载类时修改字节码 - RTW(Run Time Weaving)
运行时织入,依托
JDK代理、CGLIB等代理机制,在运行时动态修改字节码
以下主要记录 CTW 方式下的组合:Gradle+AJC
Gradle配置
在项目 settings.gradle 中配置,统一管理该插件版本
1 | plugins { |
在项目根目录 build.gradle 中配置
1 | buildscript { |
接着在 项目/模块 的 build.gradle 中配置
1 | plugins { |
Idea配置
- 安装Idea插件
AspectJ - 在Idea菜单
Project Structure(即项目结构) >Facet中,添加AspectJ并选择对应模块
注解式切面
与spring aop的使用方式类似
如
@Around、@Before、@After、@Pointcut、@AfterReturning、@AfterThrowing等
主要不同点
- 切面顺序
- 同一Aspect类有多个
PointCut时,按定义的顺序 - 不同Aspect类有同一连结点时,顺序随机,除非在Aspect类中声明
Declare Precedence
1 | package com.aa; |
上述三个切面的执行顺序为:A > B > C
- 切面作用域
默认为切面静态单例,可选perthis和pertarget
- singleton
每个
切面类有一个切面实例
注意!此时在spring中配置@Bean时,不能用
new 切面类(),而是Aspects.aspectOf(切面类.class)
- perthis
每个
目标实例有一个切面实例,切面实例随着目标实例的 创建而创建、GC回收而回收 - pertarget
每个
目标类各有一个切面实例,同一目标类的多个实例共用该类的切面实例
相关链接
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 Wyatt Wong的博客!