有些时候我们有一个需求,就是能够统计增加了某个注解方法的执行时间。很自然的,我们能够想到用AOP的方法。
由于我们熟悉编写的代码是在 Spring 下面的编写的 AOP 注解,但是很多时候,我们可能并不一定需要去一个庞大的Spring 环境,才能够实现 AOP 的功能。因为我仅仅想做的就是一个在多线程下的方法性能测试,我只是想启动最少量的代码,来实现我需要的切面功能。
搜索了一番之后终于找到在 Gradle 项目中,不启动 Spring 环境,来使用 AOP 的方案。
下面的代码将实现以@ExecutionTime
注解来修饰方法,获得方法的统计时间。
Gradle的配置
目前暂时没有找到一个官方支持的AspectJ Gradle 插件。如果你用的是 Gradle5 以上的版本,建议你跟我一样使用 arendd/AspectjGradlePlugin: AspectJ Plugin for Gradle 5+ 插件。
1 | bash复制代码project.ext { |
增加一个 ExecutionTime 注解
1 | less复制代码@Retention(RetentionPolicy.RUNTIME) |
增加一个 aspect 实现类 ExecutionTimeAspect
1 | less复制代码@Aspect |
使用
1 | csharp复制代码 @ExecutionTime |
然后,不管我们在 Junit5 测试框架中,还是实现的代码中,调用 add10K 的方法,都会获得一个日志的记录(线程,方法,执行时间),表示运行 add10K 耗费了多少时间。例如:
1 | less复制代码[calc7] method [add10K] execution time: 3841505 NANOS |
参考文档
- arendd/AspectjGradlePlugin: AspectJ Plugin for Gradle 5+
- Javing: AspectJ + Custom Annotation + Gradle (Without Spring)
本文转载自: 掘金