Создать кеш из типа объекта через аннотации

So,

Я пытаюсь преобразовать наше существующее кеширование (ehcache) в кеш-память и перейти на весенние аннотации. У меня возникают некоторые трудности с тем, чтобы аннотации работали так же, как наши существующие кеши - наши существующие кеши создаются автоматически всякий раз, когда мы кэшируем что-то из нового класса, а новый кеш имеет то же имя, что и класс объекта.

Вся текущая логика кэширования (наряду с большей частью обычной логики операций CRUD) находится в абстрактном классе, который расширен для всех наших постоянных объектов. Однако при исследовании аннотаций spring мне кажется, что мне нужно определить имя кеша в методе, что, очевидно, не работает для абстрактного класса, если только я не хочу, чтобы все наши объекты находились в одном кеше (возможно, но определенно не идеал). В идеале я бы указал имя кеша как «#this.class.toString», но SPEL не разрешен в имени кеша, как и в ключе.

Кажется, что единственный способ динамически разрешать кэш - это создать собственный преобразователь кеша, но по какой-то причине IgniteCache не расширяет кеш springframework, а javax Cache, и преобразователь кеша должен возвращать прежний. Так что я даже не понимаю, как Ignite cache вообще работает с весенними аннотациями?

Это кажется мне довольно простым вариантом использования, поэтому кажется странным, что аннотации spring заставляют меня указывать явное имя метода, когда я предполагаю, что большинство приложений любого значительного размера абстрагируют свои методы сохранения, и я чувствую, что Должно быть, я пропустил какую-то важную документацию, но я точно не могу ее найти. Есть ли способ указать имя кеша для конкретной реализации, но сохранить аннотацию кэширования для абстрактных методов?

Спасибо!


person Cameron    schedule 19.08.2016    source источник
comment
Вы использовали аннотацию Spring с EhCache? Если да, то как это работало? Если нет, то какова причина их использования в первую очередь? Почему бы не использовать Ignite API напрямую?   -  person Valentin Kulichenko    schedule 20.08.2016


Ответы (1)


Ваш вопрос довольно плотный, и не очень понятно, что вы пытаетесь сделать. Что такое "ваше существующее кэширование" для начала? Думаю, вам нужен какой-то способ пометить места, где вы на самом деле кешируете вещи. Я предполагаю, что вы уже поняли, что вам нужно поместить туда аннотацию кеша.

Что касается автоматического создания кэша, я бы не стал переключаться на другую систему кэширования и пытаться это реализовать. Попробуйте сначала перейти на аннотации кеша с существующей инфраструктурой кеша, а затем перейти на ignite.

Давайте представим, что вы все еще делаете и то, и другое. Вы правы, CacheResolver — это то, что нужно, и его можно адаптировать как к обычному org.springframework.cache.Cache, так и к javax.cache.Cache. Если у вас есть работающая настройка, я бы сделал следующее:

  • В вашей реализации CacheResolver внедрите настроенный диспетчер кеша.
  • Основываясь на вызове метода, определите имя кэша для использования (получите возвращаемый тип метода, извлеките полное доменное имя)
  • Проверьте, есть ли у менеджера кеша такой кеш. Если это так, верните это. Если он не создает новый кеш и не добавляет его, а затем возвращает этот

Если вы используете JCacheCacheManager, вы можете вызвать addCache для создания нового кэша, а затем обернуть результат в JCacheCache, чтобы он соответствовал подписи CacheResolver.

Последнее замечание: автоматическое создание кеша на основе FQN кажется мне немного хрупким, особенно если у вас есть подклассы. Вам нужно немного контролировать кэши, которые вы создаете, и настройки, которые вы к ним применяете (срок действия, размер и т. д.).

person Stephane Nicoll    schedule 22.08.2016