【问题标题】:AspectJ weaving for private methods私有方法的 AspectJ 编织
【发布时间】:2018-11-25 09:21:15
【问题描述】:

我有一个适用于公共方法的 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 "";
}

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

有什么想法吗?

【问题讨论】:

    标签: java spring aspectj


    【解决方案1】:

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

    你有很多优势:

    • 功能更强大(如您所见,某些功能在注释语法中不可用),
    • IDE 中的语法高亮显示和代码完成,
    • 更具表现力的语法(更少冗长,更优雅,即无需在建议中绑定thisJoinPoint,更轻松地使用if(),无需完全限定的类名,因为您可以直接导入它们)。

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

    【讨论】:

    • 但是我找不到一种方法来使用每个方法的语法和切入点(而不仅仅是 1 个)。你有工作代码的例子吗?
    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多