Подтвердить что ты не робот

Что делает Spring @Cacheable при размещении на методе, возвращающем список?

Я смотрел всюду онлайн для простого ответа на вышеупомянутый вопрос и просто не могу его найти. У меня есть метод вроде:

@Cacheable(cacheNames = "objects")
public List<Object> get() { .. }

Я использую EhCache 2.10.0 с Spring Framework 4.2.1, и для этого метода можно увидеть следующий вывод:

Adding cacheable method 'get' with attribute: [CacheableOperation[public java.util.List com.example.DAO.get()] caches=[objects] | key='' ...

также (при более позднем протоколировании)

Computed cache key 'SimpleKey []' for operation ...

Что такое @Cacheable аннотация, которая должна делать в этой ситуации? Поместите каждый объект в кеш с ключом hashCode (как намечено в другом месте)? Или просто plonk весь список как есть в кеше под некоторым хэш-кодом на основе списка?

4b9b3361

Ответ 1

В документе Spring Doc упоминается следующее:

Так как кеши являются хранилищами ключевого значения, каждый вызов кэшированный метод должен быть переведен в подходящий ключ для кеша доступ. Исключительно, кэширующая абстракция использует простую KeyGenerator основан на следующем алгоритме:

  • Если параметры не заданы, верните 0

  • Если задан только один параметр, верните этот экземпляр

  • Если указано больше одного параметра, верните ключ, вычисленный из хэшей всех параметров.

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/cache.html

Когда вы комментируете его с помощью @Cacheable(cacheNames = "objects"), вы указываете ему имя кеша, с помощью которого он может идентифицировать кеш. Поскольку у вашего метода нет аргументов, для cacheName как "объектов" он будет кэшировать возвращаемый объект (List<Object> в этом случае). и каждый раз, когда вызывается метод, он проверяет кеш с объектом cacheName и значением ключа как "0". Если у него уже есть объект возврата, который был кэширован в предыдущее время, он вернет объект.