Cache method results with Ehcache and Spring

Caching ist eins der Aspekte welches man nicht unbedingt direkt in der Businesslogik verankern möchte. Hierzu empfehlt es sich eine AOP-Lösung. Mit AOP kann die Funktionalität einer Cache-Realisierung genutzt werden. Eins der populärsten Cache-Provider ist Ehcache.

In dem Umfeld von Spring kann man Ehcache folgendermaßen integrieren:

Man nutzt das aus dem nicht mehr gewarteten spring-modules-Projekt das cache-Modul. Ja, spring-modules wird durch Spring-Extensions abgelöst, jedoch werden nicht alle Projekte übernommen. D.h. manche Unterprojekte (wohl auch Cache) werden nicht nach Spring-Extensions übernommen. Wo da der Sinn liegt, ist wohl nur den Betreibern klar.

Die aktuelle Version 0.9 findet man auch schon seit Monaten in keinem Maven Repository. Da bleibt nichts anderes übrig, als sich die Bibliothek (spring-modules-cache.jar) selbst in das lokale Repository zu installieren [1]

Für die Abhängigkeit: spring-modules-cache benötigt oro-2.0.8.

Um ein Bean mit Cache-Funktionalität zu erweitern, stellt spring-modules-cache z.B. CacheProxyFactoryBean zur Verfügung um Advices für das Hinzufügen von Objekten (caching advice) und Löschen von Objekte (flushing advice) aus dem Cache bereitzustellen.

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml" />
</bean>

<bean id="fCacheableService" class="org.springmodules.cache.interceptor.proxy.CacheProxyFactoryBean">
  <property name="cacheProviderFacade" ref="cacheProviderFacade" />
  <property name="cachingModels">
    <props>
      <prop key="getCodes\*">cacheName=fCache</prop>
    </props>
  </property>
  <property name="target" ref="fService" />
 
  <!-- Set a qualifier to distinguish between the available FServices -->
  <qualifier value="fMain"/>
</bean>

Wie man in der Konfiguration sehen kann, werden nur die Methoden getCodes* in dem Bean fService ge-cached. Mit dem Qualifier fMain kann man beim Autowiring nun das richtige Bean injizieren, denn durch den CacheProxyFactoryBean gibt es zwei Beans vom gleichen Typ.

Mit wenig Konfiguration hat man jetzt in Spring Caching eingeführt. Dabei wurde der Source-Code gar nicht angefasst - wenn man vom dem nun notwendigen @Qualifier absieht.

Links: [1] Maven FAQ: Install 3th party library [2] Spring-Modules: Cache

comment

Comments

arrow_back

Previous

SQL: Constraints hinzufügen

Next

JSF: Method not called
arrow_forward