Главная » Spring » Настройка  компонентов для  кеширования Spring

0

Выше мы уже определили, что метод getRantsForDay() класса Hi- bernateRantDao является первым кандидатом на кеширование. Вер- немся к определению контекста приложения Spring и обернем эле- ментом <ehcache:proxy> объект класса HibernateRantDao, чтобы обес- печить кеширование всех результатов, возвращаемых его методом getRantsForDay():

1 Эти настройки были выбраны довольно произвольно, но они достаточно разумны. Естественно, при подготовке приложения к развертыванию не- обходимо рассмотреть разные варианты его использования и определить наиболее подходящие настройки.

<ehcache:proxy id="rantDao"

refId="rantDaoTarget">

<ehcache:caching

methodName="getRantsForDay" cacheName="rantzCache"  />

</ehcache:proxy>

Элемент <ehcache:caching> определяет методы, вызовы которых должны перехватываться и для которых должны возвращаться ке- шированные значения. В данном случае атрибут methodName опреде- ляет имя getRantsForDay() кешируемого метода и используемый для этих целей кеш rantzCache.

В элемент <ehcache:proxy> можно поместить сколько угодно эле- ментов <ehcache:caching>, описывающих методы компонента. Можно добавить по одному элементу <ehcache:caching> на каждый кешируе- мый метод или использовать шаблонные символы в именах, чтобы единственным элементом <ehcache:caching> определить целую группу методов. Следующий элемент <ehcache:caching> включает кеширова- ние для всех методов с именами, начинающимися со слова get:

<ehcache:caching

methodName="get*" cacheName="rantzCache"  />

Добавление результатов в кеш – это лишь половина проблемы. Спустя некоторое время кеш заполнится большим количеством данных, часть которых может оказаться просто ненужной. В конеч- ном итоге может появиться потребность очистить кеш и начать за- полнять его заново. Посмотрим, как можно выполнить сброс кеша в результате вызова метода.

Сброс кеша

В то время как элемент <ehcache:caching> объявляет методы, ре- зультаты которых сохраняются в кеше, элемент <ehcache:flushing> объявляет методы, вызовы которых очищают кеш. Например, пред- положим, что необходимо организовать сброс кеша rantzCache при вызове метода saveRant(). Необходимые для этого настройки содер- жит следующий элемент <ehcache:flushing>:

<ehcache:flushing methodName="saveRant" cacheName="rantzCache"  />

По умолчанию кеш, определяемый атрибутом cacheName, будет сброшен после вызова метода, имя которого указано в атрибуте methodName, но есть возможность изменить момент сброса кеша, опре- делив его в атрибуте when:

<ehcache:flushing methodName="saveRant" cacheName="rantzCache" when="before"   />

Значение before в атрибуте when требует, чтобы кеш сбрасывался перед вызовом метода saveRant().

Настройка кеширования для вложенных компонентов

Обратите внимание на атрибуты id и refId элемента <ehcache:proxy>. Прокси-объекту, создаваемому элементом <ehcache:proxy>, будет при- своен идентификатор rantDao. Однако это идентификатор сущест- вующего компонента типа HibernateRantDao. Поэтому необходимо переименовать существующий компонент в rantDaoTarget с помощью атрибута refId. (Это не противоречит особенностям именования прокси- и целевых объектов в классическом аспектно-ориентиро- ванном программировании в Spring.)

Если применение атрибутов id/refId кажется вам неуклюжим, тогда можно объявить целевой компонент вложенным по отно- шению к элементу <ehcache:proxy>. Например, следующий элемент

<ehcache:proxy> определяет компонент типа HibernateRantDao как вло- женный компонент:

<ehcache:proxy id="rantDao">

<bean    class="com.roadrantz.dao.HibernateRantDao">

<property   name="sessionFactory"

ref="sessionFactory" />

</bean>

<ehcache:caching methodName="getRantsForDay" cacheName="rantzCache"  />

</ehcache:proxy>

Использование вложенных компонентов не избавляет от необхо- димости объявлять по одному элементу <ehcache:proxy> для каждого

кешируемого компонента и по одному или более <ehcache:caching> элементов для методов. Для простых приложений это совсем не- сложно. Но с ростом кешируемых компонентов и методов XML- файл конфигурации Spring будет разбухать все больше и больше.

Если даже подход на основе вложенных компонентов покажется неудобным или потребуется обеспечить кеширование нескольких компонентов, можно подумать об использовании поддержки де- кларативного кеширования с помощью аннотаций Spring Modules. Скажем элементу <ehcache:proxy> «прощай» и посмотрим, как Spring Modules обеспечивает  поддержку  декларативного  кеширования с помощью аннотаций.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии