Infinispan als Cache Provider für das Spring Framework

Das Spring Framework bietet ab der Version 3.1 eine Cache Abstraktion. Dadurch wird Entwicklern die Möglichkeit geboten den Spring-Beans durch die Annotationen @Cacheable und @CacheEvict ein Caching von Methodenaufrufen hinzuzufügen.
Out of the box nutzt Spring 3.1 für dieses Caching den EHCache. Da Spring aber zusätzlich eine einfache SPI zur Verfügung stellt, welche andere Cacheprovider implementieren können, kann auch Infinispan leicht als Cacheimplementierung integriert werden.

Die Aktivierung der Cache Unterstützung im application context erfolgt durch folgende Deklaration:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

  <cache:annotation-driven />

</beans>

Durch diese Konfiguration wertet das Springframework die Cacching-Annotationen @Cacheable und @CacheEvict im Code aus.

Damit Spring Infinispan als cache provider benutzt sind die folgenden Spring 3.1 Cache Interfaces relevant:

org.springframework.cache.CacheManager und org.springframework.cache.Cache.

Der CacheManager dient als Factory für “named cache Instanzen”. Standardmäßig sucht Spring zur Laufzeit nach einer Implementierung von CacheManager mit dem BeanName “cachemanager” im Application Context.
Mit folgendem Eintrag im Application Context konfiguriert man Spring so, dass Infinispan als Cache Provider genutzt wird:

<!-- Infinispan cache manager -->
<bean id="cacheManager"
  class="org.infinispan.spring.provider.SpringEmbeddedCacheManagerFactoryBean"
  p:configurationFileLocation="classpath:/META-INF/oio-bookmanagement-infinispan-config.xml" />

Caching im Applikationscode

Das Caching wird auf Applikationsebene durch das Hinzufügen von @Cacheable und @CacheEvict zu Methoden der Spring-Beans aktiviert.

@Transactional
@Cacheable(value = "booksForUser", key = "#userId")
List<book> findBooksForUser(Integer userId) {...}

Zurückgegebene Instanzen des Methodenaufrufs sind im named cache “booksForUser” gespeichert. Der Parameter userId ist der Cache-Key. “#userId” ist eine Expression in der Spring Expression Language, die das Argument userId evaluiert. Wenn kein Key spezifiziert ist, nutzt Spring einen Hash-Wert mit den an die Methode übergebenen Parametern als Cache-Key. Mit Hilfe der Annotation @CacheEvict kann dann zusätzlich deklariert werden, auf welche Weise der Cache geleert werden soll:

@Transactional
@CacheEvict(value = "booksForUser", key = "#userId")
void deleteBooksForUser(Integer userId) {...}
Short URL for this post: https://wp.me/p4nxik-1M3
This entry was posted in Java EE, Java Persistence, Spring Universe and tagged , , , , . Bookmark the permalink.

Leave a Reply