AspectJ ткачество для частных методов - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть аннотация 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, который не поддерживается для аннотаций, и я использую AspectJ без SpringAOP.

есть идеи?

1 Ответ

0 голосов
/ 25 ноября 2018

Ответ прост: используйте собственный синтаксис AspectJ. Вы упомянули это сами.Вы даже сказали, что используете полный AspectJ, а не Spring AOP.Таким образом, переключение не должно быть проблемой.

У вас есть много преимуществ:

  • больше мощности (некоторые функции недоступны в синтаксисе аннотаций, как вы заметили),
  • подсветка синтаксиса и завершение кода в IDE,
  • более выразительный синтаксис (менее многословный и более элегантный, т. е. нет необходимости связывать thisJoinPoint в советах и ​​более простое использование if(), не требуется полностью квалифицированный классимена, потому что вы можете просто импортировать их).

Синтаксис IMO на основе аннотаций просто ужасно труден для чтения, все находится в одной строке внутри параметра аннотации.Я использую его, только если у меня нет другого выбора или когда я отвечаю на вопросы здесь.

...