Порядок обработки аннотаций в Spring (@Cacheable и @Timed) - PullRequest
4 голосов
/ 04 ноября 2019

Я хочу аннотировать свой метод с помощью @Cacheable, а также @Timed (из микрометра). Но я бы хотел, чтобы @Timed применялся только в том случае, если данные не синхронизированы. Есть ли способ сделать это, достаточно ли разместить аннотации в правильном порядке - и в каком порядке это будет?

Мой @Timed также использует TimedAspect, не уверен, что это актуально.

Сейчас я делаю это, как показано ниже:

@Cacheable
@Timed
public String getValue(long id) {
    ...
}

Я не смог найти документацию для @Cacheable, которая бы обсуждала это.

1 Ответ

1 голос
/ 04 ноября 2019

Это сложно, поскольку вы имеете дело с прокси-серверами AOP, созданными Spring для вашего бизнес-компонента, поэтому я не уверен, можете ли вы полагаться на порядок аннотаций.

Я думаю, что у вас есть несколькоОпции:

  • Возможно, вы захотите рефакторинг вашего кода, чтобы иметь несколько методов, один из которых помечен @Cacheable, а другой - @Timed. Тем не менее, я думаю, что это не сработает с вами, так как вам нужно более одного компонента (вызовы с одним и тем же компонентом не перехватываются прокси-серверами AOP). Следовательно, вам понадобятся два bean-компонента: один выполняет роль фасада, а другой выполняет фактический @Timed дорогой вызов, который вы хотите кэшировать и отслеживать.
  • Другой вариант может заключаться в расширении как @Timed, так и * 1012. * и внедрите Orderable в обоих интерфейсах, затем используйте их в своем бине. Я не совсем уверен, что это сработает, так как это будет зависеть от того, как будут собраны аннотации. Что-то вроде этого: Указание порядка создания прокси в Spring

Надеюсь, это поможет.

...