2013-06-19 3 views
2

Возможно ли, что абстракция кэширования весны заселяет кеш с данным предметом, а не просто прочитывает его?Обновление весеннего кэша

Представьте, что у меня есть методы Thing getItem(UUID id) и setItem(UUID id, Thing thing). Я бы хотел использовать @Cacheable на первом, чтобы прочитать его из кеша, и если он отсутствует, вызывается базовый метод. Когда вызывается сеттер, я хотел бы добавить параметр thing в кэш, а затем вызвать метод, сохранив его в базовом хранилище.

+1

я отвечал на ваш вопрос «CachePut», но, глядя на http://static.springsource.org/spring/docs/3.1.x/ spring-framework-reference/html/cache.html # cache-annotations-put вы должны вернуть «вещь», чтобы она работала. Я предполагаю, что лучшим ответом будет аннотация setItem с «CacheEvict», поэтому он удалит старое значение из кеша. В следующий раз, когда вызывается getItem, он будет заполнен новым значением. – Luciano

ответ

1

Как сказал Лучиано, вы можете установить аннотацию @CachePut для метода, но, как он утверждает, это приведет к изменению вашего API. Это может быть преимуществом, хотя, в зависимости от того, нравится вам семантика, которую вы получаете, с флюидным API-интерфейсом.

У вас есть еще один вариант, но он привяжет вас к Spring и заставит ваш код setItem быть немного более неприятным. Вы всегда можете подключиться в CacheManager и установить данные в кеше сами по себе в методе setItem.

Так что бы выглядеть примерно так:

@Autowire private CacheManager cacheManager; 

public void setItem(UUID id, Thing thing) { 
    Cache c = cacheManager.getCache("cacheName"); 
    if (c != null) { 
    c.put(id, thing); 
    } 
    //Do more 
} 
1

Я не думаю, что он способен это сделать. Он просто позволяет вам определить экземпляры, которые будут кэшироваться через @Cachable, и удалять их через @CacheEvict. Как я знаю, нет другого способа вмешаться в этот рабочий механизм. Также вы можете определить пользовательскую аннотацию для достижения такой же функциональности.

Смежные вопросы