我有一个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。
有什么想法吗?
答案 0 :(得分:0)
答案很简单:使用本机AspectJ语法。。您自己提到过它。您甚至说您使用的是完整的AspectJ,而不是Spring AOP。因此切换应该不是问题。
您有很多优势:
thisJoinPoint
并更容易使用if()
,不需要完全合格的类名,因为您可以导入它们) 。基于注释的语法IMO非常难以阅读,所有内容都位于注释参数内的单个字符串中。我只会在没有其他选择或在此处回答有关问题时使用它。