Предотвратить Spring кеширование для определенного класса - PullRequest
2 голосов
/ 03 ноября 2011

В некотором коде есть интерфейсный метод с пружинной кешируемой аннотацией.У меня есть декоратор класса, который изменяет этот метод.Код в основном

interface Foo {
  @Cacheable
  Widget doit();
}

class StandardFoo implements Foo {
   public Widget doit();
}

class FooDecorator implements Foo {
  Foo decorated;

  public Widget doit() {
    Widget = decorated.doit();
    ..some fun stuff
    return new SlightlyDifferentWidget();
  }
}

Моя проблема заключается в том, что во время цепочки вызовов вызывается декоратор, а затем вызывается декорированный объект.Spring (или Ehcache) затем решает кэшировать объекты, возвращаемые декорированным экземпляром.FooDecorator затем с радостью возвращает измененный виджет в первый раз.

При втором вызове Spring видит вызов Foo.doit() (который на самом деле FooDecorator.doit()) и возвращает объекты, которые он кэшировал (которые невернызначения из StandardFoo.doit()).

Итак, я хотел бы добавить конфигурацию где-нибудь, которая сообщает Spring / Ehcache только кэшировать значения из DecoratedFoo или не кэшировать значение, возвращенное другой реализацией.

Обратите внимание, что удаление аннотации @Cacheable из интерфейса недоступно.

1 Ответ

2 голосов
/ 04 ноября 2011

@Cacheable имеет функцию условного кэширования (см. 35.3.1 Условное кэширование ). Условный параметр принимает выражение SpEL.

interface Foo {
    @Cacheable(condition = "doCache")
    Widget doit(boolean doCache);
}

Параметр doCache (или более элегантный SpEL) можно использовать для управления кэшированием. Типы могут быть сопоставлены как foo instanceof T(Bar).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...