sbt 项目通过 sbt-aspectj-plugin 使用 AspectJ

Java 在运用面向方向编程时,依照  AspectJ 的语法自己书写 *.aj 文件可以得到尽可能大的控制能力。如果是一个 sbt 的项目,有一个 sbt-aspectj-plugin 插件可以帮上我们的忙。那么如何应用这个插件呢? 该插件首页面告诉我们要在 project/plugins.sbt 中加上下面这句话

其他就是参考例子 runnable sample projects,然而这几个例子并非那么直白。所以还是自己做一个最简单的例子来体验 sbt 项目如何使用 AspectJ.

这是一个默认的 sbt+AspectJ 的项目布局

sbt-aspectj-sample/
├── build.sbt
├── project
│   ├── build.properties
│   └── plugins.sbt
└── src
    └── main
        ├── aspectj
        │   └── SampleAspect.aj
        └── java
            └── sample
                └── Sample.java

各文件的内容分别如下:

build.sbt

上面的配置是把属性用 project.setting() 方法来设置,也可以不依赖于 (project in file(".")),下面的配置是一样的

和 .settings(aspectjSetting:_*) 一样,上面的 aspectjSetting 同样是关键,否则会报如下错误:

build.properties (只放了一行)

plugins.sbt (加载 sbt-aspectj 依赖)

src/main/java/sample/Sample.java (Java 代码在 sbt 项目中默认位置)

src/main/aspectj/SampleAspect.aj (方面定义文件默认放在 src/main/aspectj 目录中)

用 aspect 定义方面,文件名是  *.aj,它也可以用 Java 一样用  package sample 来定义包名,但没要求包名与目录层次一致。上面方面定义的是在招待 sample.Sample.main() 方法前打印 "Wearved content from SampleAspect".

现在来看执行效果

进到 sbt-aspectj-sample 目录中,然后执行 sbt 命令,接着执行 sbt 的 run 任务就会看到下面的输出

从上面可看出在执行 sample.Sample.main() 方法之前执行了方面 SampleAspect 中 before() 指定的方法,说明拦截成功。

这里只是一个最简单的例子实现了方面的正确切入,更多 AspectJ 的语法如 after(), around() 或捕获异常等,请参考其他相关资料。

 比如可以把 src/main/aspectj/SampleAspect.aj 改为

同时把 build.sbt 中的

verbose in Aspectj := true

改为

verbose in Aspectj := false

再进到 sbt 控制台执行下 run param1 param2 看下输出是

这样拦截了整个方法的前前后后的执行,借此可以修改目标方法原有的参数值。

本文链接 https://yanbin.blog/sbt-project-sbt-aspectj-plugin-use-aspectj/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments