Last Updated: February 25, 2016
· zohebsait

Using Spring 3.1's @Cacheable

Before Spring 3.1 I used to use the the @Cacheable annotation provided by the ehcache-spring-annotations project. However with the introduction of Spring Cache, you no longer need to use that library and can use the org.springframework.cache.annotation.Cacheable annotation instead.

To migrate, all you need to do is replace the @Cacheable with the one from spring.

I still needed to maintain a blocking cache which I could easily in the old library, and it was not clear from the Spring documentation how to do that. The solution I went with was, to provide a cacheDecoratorFactory in the ehcache.xml. Something like

<cache name="dataCache" eternal="false"
               maxElementsInMemory="0" overflowToDisk="false" diskPersistent="false"
               timeToIdleSeconds="0" timeToLiveSeconds="14400"
               memoryStoreEvictionPolicy="LRU" statistics="true">

            <cacheDecoratorFactory class="com.saitz.BlockingCacheDecoratorFactory"></cacheDecoratorFactory>

where BlockingCacheDecoratorFactory is (in Scala)

class BlockingCacheDecoratorFactory extends CacheDecoratorFactory {
      def createDecoratedEhcache(cache: Ehcache, properties: Properties): Ehcache = {
    return createBlockingCache(cache);

  def createDefaultDecoratedEhcache(cache: Ehcache, properties: Properties): Ehcache = {
    return createBlockingCache(cache);

  def createBlockingCache(cache:Ehcache):Ehcache = {
    val blockingCache = new BlockingCache(cache);
    return blockingCache;