使用插件 aspectj-maven-plugin 织入 AspectJ AOP

这篇博客介绍了如何使用aspectj-maven-plugin插件在非Spring环境中进行AspectJ AOP的编译时织入。通过创建带有@LogStartTime注解的方法,定义切面类MethodStartAspect,以及编写测试用例,展示了如何在Maven项目中配置和使用该插件,确保切面正常工作。文章还提到了切面定义在不同模块间共享的配置方法,以及AspectJ与JDK 9的兼容性问题。
摘要由CSDN通过智能技术生成

昨天刚刚侍弄完 Spring 下基于自定义注解拦截方法调用,现在试下纯 AspectJ 的方式来打造,因为不是每一个项目都是 Spring。这次要推到 5 年前试验过用 javac 命令行编译的方式织入方面,见 AspectJ 基于自定义的方法注解来拦截方法,这次着重在用 aspectj-maven-plugin 插件的方法来织入 AspectJ 方面。

基本上代码还是昨天的,需求还是一样的:

被 @LogStartTime 注解的方法在进入该方法时记录当前时间在 ThreadLocal 中,并能根据 @LogStartTime 的属性值决定处理逻辑

因为 Java5+ 之后 AspectJ 可以写成 Java 类加注解的方式,*.aj 文件一般都没太大必要了,所以可以和 Spring AOP 共用一个 @Aspect 注解的方面代码 MethodStartAspect

我们将采用编译器织入,因此项目依赖只需要一个 org.aspectj:aspectjrt:1.8.0, 它也不会引入别的组件。同样我们从 Main 方法和测试用例两方面来验证实现的效果,下面是整个测试项目的布局,以及依赖,除掉单元测试的其时就只需要一个 jar 包。

继续罗列代码

@LogStartTime, 注解被拦截的方法

 

1

2

3

4

5

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface LogStartTime {

    String value() default "";

}

 

MethodStartAspect, 定义切面和 Advice

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

@Aspect

public class MethodStartAspect {

 

    private static ThreadLocal<Long> startTime = new ThreadLocal<>();

 

    @Pointcut("execution(* cc.unmi..*(..)) && @annotation(logStartTime)")

    private void logStartTimePointcut(LogStartTime logStartTime) {

 

    }

 

    @Before("logStartTimePointcut(logStartTime)")

    public void setStartTimeInThreadLocal(LogStartTime logStartTime) {

        System.out.println(logStartTime.value());

        startTime.set(System.currentTimeMillis());

        System.out.println("saved method start time in threadLocal");

    }

 

    public static Long getStartTime() {

        return startTime.get();

    }

 

    public static void clearStartTime() {

        startTime.set(null);

    }

}

 

只要用 @Aspect 标识出它是一个 Aspect, 或者也可以完全用 AspectJ 语法,创建 *.aj 文件,里面写 public aspect MethodStartAspect 这样的的定义。在进入有注解 @LogStartTime 方法之前把当前时间写到 ThreadLocal 中去,并可读取注解的属性值。

UserService, 被拦截的方法用了 @LogStartTime 注解

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class UserService {

 

    @LogStartTime(&#

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值