AspectJ编织私有方法

时间:2018-11-25 09:21:16

标签: java spring aspectj

我有一个AspectJ编织注释,该注释适用于公共方法,但是私有方法被忽略。 此方法的目的是简单地记录运行该功能所花费的时间。

@Aspect
@Slf4j
public class TimedLogAspect {

    @Pointcut("@annotation(timedLogVar)")
    public void annotationPointCutDefinition(TimedLog timedLogVar) {}

    @Pointcut("execution(* *(..))")
    public void atExecution() {}

    @Around(value = "annotationPointCutDefinition(timedLogVar) && atExecution()", argNames = "joinPoint,timedLogVar")
    public Object around(ProceedingJoinPoint joinPoint, TimedLog timedLogVar) throws Throwable {
        Stopwatch stopwatch = Stopwatch.createStarted();
        Object returnValue = joinPoint.proceed();
        stopwatch.stop();

        MessageBuilder messageBuilder = new MessageBuilder(joinPoint.toShortString(), stopwatch.elapsed(TimeUnit.MILLISECONDS))
                .attachMessage(timedLogVar.message())
                .attachMethodArgs(timedLogVar.shouldAttachMethodArgs(), Stream.of(joinPoint.getArgs()).collect(Collectors.toList()))
                .attachReturnValue(timedLogVar.shouldAttachReturnValue(), returnValue);

        log.info(messageBuilder.build(), messageBuilder.getArgs().toArray());

        return returnValue;
    }
}

这是实际的接口:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimedLog {
    boolean shouldAttachMethodArgs() default false;
    boolean shouldAttachReturnValue() default false;
    String message() default "";
}

我看到了很多答案,在private部分的第一个*之前添加了execution,我看到了privileged不受支持注释,而我正在使用没有SpringAOP的AspectJ。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

答案很简单:使用本机AspectJ语法。。您自己提到过它。您甚至说您使用的是完整的AspectJ,而不是Spring AOP。因此切换应该不是问题。

您有很多优势:

  • 功能强大(如您所注意到的,注释语法中某些功能不可用)
  • IDE中的语法突出显示和代码完成
  • 更具表现力的语法(更冗长,更优雅,即不需要在建议中绑定thisJoinPoint并更容易使用if(),不需要完全合格的类名,因为您可以导入它们) 。

基于注释的语法IMO非常难以阅读,所有内容都位于注释参数内的单个字符串中。我只会在没有其他选择或在此处回答有关问题时使用它。