Perf4j @profiled аннотация для частного метода

Я добавил @Profiled аннотация для публичного и частного метода. Я вижу журналы времени для открытых методов. Но нет никаких журналов синхронизации для частных методов.

Я сделал настройки правильно.

@Profiled
public BigInteger nextPrime() {
    currentPrime = currentPrime.nextProbablePrime();
    return currentPrime;
}

@Profiled
private void test()
{
    try{
    Thread.sleep(100);
    }catch(Exception e)
    {
       e.printStackTrace();
     }
}

Является ли аннотация @profiled применимой только для открытых методов?

2 ответа

Скорее всего, вы настроили perf4j с Spring AOP, и поскольку прокси Spring AOP не вызываются, когда метод вызывается из того же класса (как в вашем случае с test метод), статистика производительности не будет записана.

Прочтите этот пост в блоге, который объясняет подводные камни Spring AOP

Одним из решений вашей проблемы было бы использование AspectJ с perf4j, поскольку AspectJ может справиться с ситуацией такого типа

Да. Это ограничение Spring AOP:

При использовании прокси вы должны применять свои аннотации только к методам с публичной видимостью. Если вы аннотируете защищенные, закрытые или видимые пакетами методы с этими аннотациями, ошибка не возникает, но аннотированный метод не отображает настроенные параметры кэширования. Рассмотрите возможность использования AspectJ (см. Ниже), если вам нужно аннотировать непубличные методы, так как он изменяет сам байт-код ".

Другие вопросы по тегам